Generar etiquetas basadas en argumentos macro.

Generar etiquetas basadas en argumentos macro.

No soy lo suficientemente competente en LaTeX para resolver lo siguiente. Tengo una macro que toma dos parámetros, crea un bonito cuadro, pone el primer argumento en negrita y el segundo argumento en un texto resaltado:

\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} }

Llamo a esta macro de 10 a 15 veces en texto (esa cantidad de pasos tengo). Para poder hacer referencia a la página donde se expande esta macro, ahora me gustaría colocar una etiqueta. Si cambio la última línea a:

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

Los errores comienzan a aparecer. Entiendo esto, en una línea completamente ajena:

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

Esta línea probablemente provenga de algún archivo auxiliar.

¿Cómo expandir adecuadamente el primer argumento y usarlo como argumento para etiquetar? El primer argumento no tiene espacios y nunca los tendrá.

Respuesta1

Puede redefinir \textsuperscriptmientras configura la etiqueta. Aquí \@firstofonehabría una buena redefinición. Este comando simplemente lee el argumento y lo usa tal como está.

También \csname phantomsection\endcsnamepuede ser una buena idea tener enlaces que funcionen con el paquete 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}

Simplemente \csname phantomsection\endcsnamesería \relax, si hyperrefno se usa, por lo que es casi nada.

Respuesta2

Yo lo haría de otra manera:

\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]}

De esta manera \fboxquedará centrado en la línea y tendrá igual espacio antes y después (corrija los espacios, si no le gustan como están ahora).

Preste atención a que se permiten espacios en las etiquetas, pero no caracteres ni comandos acentuados. Así que \Step{R\textsuperscript{+}4.a}{blah, blah}seguramente dará problemas. Puedes resolverlo diciendo

\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]}

y llamar a esta entrada problemática como

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

refiriéndose entonces a

\pageref{R+4.a}

información relacionada