
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 \textsuperscript
ao definir o rótulo. Aqui \@firstofone
seria uma boa redefinição. Este comando simplesmente lê o argumento e o utiliza como está.
Também \csname phantomsection\endcsname
pode 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\endcsname
seria simplesmente \relax
, se hyperref
nã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 \fbox
ficarã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}