Gere rótulos com base no argumento macro

Gere rótulos com base no argumento macro

Não sou proficiente em LaTeX o suficiente para resolver o seguinte. Eu tenho uma macro que recebe dois parâmetros, cria uma bela caixa, coloca o primeiro argumento em negrito e o segundo argumento em um texto enfatizado:

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

Eu chamo essa macro 10 a 15 vezes em texto (quantas etapas eu tenho). Para poder fazer referência à página onde esta macro está expandida, gostaria agora de colocar um rótulo. Se eu mudar a última linha para:

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

erros começam a aparecer. Eu entendo isso, em uma linha completamente não relacionada:

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

Esta linha provavelmente vem de algum arquivo auxiliar.

Como expandir adequadamente o primeiro argumento e usá-lo como argumento para rotular? O primeiro argumento não possui espaços e nunca os terá.

Responder1

Você pode redefinir \textsuperscriptao definir o rótulo. Aqui \@firstofoneseria uma boa redefinição. Este comando simplesmente lê o argumento e o utiliza como está.

Também \csname phantomsection\endcsnamepode ser uma boa ideia ter links funcionais com package 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}

O \csname phantomsection\endcsnameseria simplesmente \relax, se hyperrefnão for usado, então é quase nada.

Responder2

Eu faria de uma maneira diferente:

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

Desta forma eles \fboxficarão centralizados na linha e terão espaços iguais antes e depois dela (corrija os espaçamentos, caso não goste deles como estão agora).

Preste atenção que são permitidos espaços nos rótulos, mas não caracteres acentuados ou comandos. Então \Step{R\textsuperscript{+}4.a}{blah, blah}certamente dará problemas. Você pode resolver isso dizendo

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

e chame essa entrada problemática de

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

referindo-se então a

\pageref{R+4.a}

informação relacionada