Beschriftungen basierend auf Makroargumenten generieren

Beschriftungen basierend auf Makroargumenten generieren

Meine LaTeX-Kenntnisse reichen nicht aus, um Folgendes zu lösen. Ich habe ein Makro, das zwei Parameter annimmt, eine schöne Box erstellt, das erste Argument fett und das zweite Argument hervorgehoben darstellt:

\newcommand{\Step}[2]{%
\noindent{\\[0pt] \rule{0pt}{0.5ex}%
\hspace*{1em}\fbox{\parbox[t]{0.92\columnwidth}{{\bfseries Step #1.\ }\emph{#2}}}}
    \vspace*{1.1ex} }

Dieses Makro rufe ich 10-15 mal im Text auf (so viele Schritte habe ich). Um auf die Seite verweisen zu können, auf der dieses Makro ausgeklappt wird, möchte ich nun eine Beschriftung platzieren. Ändere ich die letzte Zeile in:

    \vspace*{1.1ex} \label{step:mode:#1} }

Es tauchen Fehler auf. Ich bekomme Folgendes in einer völlig anderen Zeile angezeigt:

! Missing \endcsname inserted.
<to be read again> 
               \protect 
l.160 ...aults Occur\relax }{figure.caption.52}{}}

Diese Zeile stammt wahrscheinlich aus einer Hilfsdatei.

Wie kann ich das erste Argument richtig erweitern und als Argument für die Beschriftung verwenden? Das erste Argument hat keine Leerzeichen und wird auch nie welche haben.

Antwort1

Sie können \textsuperscriptbeim Festlegen des Labels eine Neudefinition vornehmen. Hier \@firstofonewäre eine gute Neudefinition. Dieser Befehl liest einfach das Argument und verwendet es, so wie es ist.

Außerdem \csname phantomsection\endcsnamekann es sinnvoll sein, zusätzlich funktionierende Links zum Paket zu haben hyperref:

\documentclass{article}
\usepackage{lipsum}% for demonstration only
\usepackage{hyperref}% to show, that this works

\makeatletter
\newcommand{\Step}[2]{%
  \par\noindent{\rule{0pt}{0.5ex}%
    \csname phantomsection\endcsname
    {\let\textsuperscript\@firstofone\label{#1}}%
    \hspace*{1em}\fbox{\parbox[t]{\dimexpr \linewidth-2em-2\fboxsep-2\fboxrule\relax}{%
        {\bfseries Step #1.\ }\emph{#2}}}}\par
  \vspace*{1.1ex} 
}
\makeatother

\begin{document}
\Step{R\textsuperscript{+}4.a}{blah, blah}
See R\textsuperscript{+}4.b on page \pageref{R+4.b}.
\lipsum

\Step{R\textsuperscript{+}4.b}{blah, blah}
See R\textsuperscript{+}4.a on page \pageref{R+4.a}.
\lipsum

\end{document}

Das \csname phantomsection\endcsnamewäre einfach \relax, wenn hyperrefes nicht verwendet wird, also ist es fast nichts.

Antwort2

Ich würde es anders machen:

\usepackage{calc}
\newcommand{\Step}[2]{%
  \par\addvspace{1.1ex}
\noindent\hspace*{1em}\fbox{\parbox[t]{\columnwidth-2em-2\fboxsep-2\fboxrule}
  {\textbf{Step #1.}\ \emph{#2}}}\label{step:mode:#1}\\*[1.1ex]}

Auf diese Weise \fboxwerden sie auf der Zeile zentriert und haben davor und danach den gleichen Abstand (korrigieren Sie die Abstände, wenn sie Ihnen so, wie sie jetzt sind, nicht gefallen).

Beachten Sie, dass Leerzeichen in Beschriftungen erlaubt sind, aber keine Akzentzeichen oder Befehle. Das \Step{R\textsuperscript{+}4.a}{blah, blah}wird sicherlich Probleme geben. Sie können es lösen, indem Sie sagen

\newcommand{\Step}[3]{%
  \par\addvspace{1.1ex}
\noindent\hspace*{1em}\fbox{\parbox[t]{\columnwidth-2em-2\fboxsep-2\fboxrule}
  {\textbf{Step #2.}\ \emph{#3}}}\label{step:mode:#1}\\*[1.1ex]}

und nennen Sie diesen problematischen Eintrag als

\Step[R+4.a]{R\textsuperscript{+}4.a}{blah, blah}

Bezugnehmend auf

\pageref{R+4.a}

verwandte Informationen