根据宏参数生成标签

根据宏参数生成标签

我对 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只是,所以它几乎没有什么。\relaxhyperref

答案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}

相关内容