Генерация меток на основе макроаргумента

Генерация меток на основе макроаргумента

Я недостаточно хорошо владею LaTeX, чтобы решить следующую задачу. У меня есть макрос, который принимает два параметра, создает красивое поле, выделяет первый аргумент жирным шрифтом, а второй аргумент — выделенным текстом:

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

Я вызываю этот макрос 10-15 раз в тексте (столько шагов у меня есть). Чтобы иметь возможность ссылаться на страницу, где этот макрос развернут, я бы хотел разместить метку. Если я изменю последнюю строку на:

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

Начинают выскакивать ошибки. Я получаю это, в совершенно не связанной строке:

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

Вероятно, эта строка взята из какого-то вспомогательного файла.

Как правильно развернуть первый аргумент и использовать его в качестве аргумента для метки? Первый аргумент не имеет пробелов и никогда не будет иметь их.

решение1

Вы можете переопределить \textsuperscriptпри установке метки. Вот \@firstofoneхорошее переопределение. Эта команда просто считывает аргумент и использует его таким, какой он есть.

Также \csname phantomsection\endcsnameможет быть хорошей идеей иметь рабочие ссылки с пакетом 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}

Было \csname phantomsection\endcsnameбы просто \relax, если hyperrefбы не использовалось, так что это почти ничего.

решение2

Я бы сделал по-другому:

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

Таким образом, они \fboxбудут располагаться по центру строки и иметь одинаковое расстояние до и после нее (исправьте интервалы, если они вам не нравятся).

Обратите внимание, что в метках допускаются пробелы, но не акцентированные символы или команды. Так что \Step{R\textsuperscript{+}4.a}{blah, blah}наверняка возникнут проблемы. Вы можете решить это, сказав

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

и назовите эту проблемную запись

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

ссылаясь затем на

\pageref{R+4.a}

Связанный контент