如何重复文本而不重复它?

如何重复文本而不重复它?

我已经定义了一个命令,用于在文档中写下“需求”。它会自动设置样式和编号,并创建一个标签,我可以参考该标签来获取编号 - 真的很棒。但是,有时我想在引用需求时重复其全文,这样读者就不必返回文档。我当然不想重写它,因为当我在一个地方更改它时很容易出错。如何使用命令重复文本?

我的命令定义当前形式如下:

\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 延迟两个周期。

相关内容