
Я недостаточно хорошо владею 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}