我对 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}