我已经定义了一个命令,用于在文档中写下“需求”。它会自动设置样式和编号,并创建一个标签,我可以参考该标签来获取编号 - 真的很棒。但是,有时我想在引用需求时重复其全文,这样读者就不必返回文档。我当然不想重写它,因为当我在一个地方更改它时很容易出错。如何使用命令重复文本?
我的命令定义当前形式如下:
\newcommand{\requirement}[2]{
\vspace{10pt}
\noindent
\textbf{
\refstepcounter{reqnum}
\label{req:#2}
R\thereqnum: #1
}
}
我尝试了以下多种尝试,但都无济于事:
\newcommand{\requirement}[2]{
\vspace{10pt}
\noindent
\textbf{
\refstepcounter{reqnum}
\label{req:#2}
R\thereqnum: #1
}
\newcommand{\req{#2}}{#1}
}
答案1
有\csname <string>\endcsname
,它发出命令\<string>
。您还可以使用 etoolbox 中的宏,使用起来非常方便。
如果你\newcommand{\req{#2}}{#1}
用替换\expandafter\def\csname req#2\endcsname {#1}
,它应该可以工作。
\def\name
定义一个宏\name
。与 不同,它不会询问\newcommand
它是否已经存在。因此,\name
如果\name
已经存在,它会覆盖 。这可能很有用,但通常是有害的。
如果只写\def\csname req#2\endcsname {<definition>}
,它会尝试重新定义\csname
并引发错误,因为只有\endcsname
(并且缺少\
)。
如果你\expandafter
把\def
\expandafter\def\csname req#2\endcsname {<definition>}
变成
\def\req<argument2> {<definition>}
好了,它被定义了。\expandafter
延迟下一个标记的扩展(可以是命令序列)。两个 expandafter 延迟两个周期。