如何重複文字而不重複文字?

如何重複文字而不重複文字?

我已經定義了一個用於在文件中寫下“要求”的命令。它會自動對其進行樣式設定和編號,並建立一個標籤,我可以參考該標籤來獲取編號 - 非常好。然而,有時我想在引用需求時重複其全文,這樣讀者就不必返回文件。我當然不想重寫它,因為當我在一個地方更改它時,很容易出錯。如何使用指令重複文字?

我的命令定義的當前形式如下:

\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並拋出錯誤,因為存在 lonesome \endcsname(並且缺少\)。

如果你放在\expandafter前面\def

\expandafter\def\csname req#2\endcsname {<definition>}

變成

\def\req<argument2> {<definition>}

和tada,它被定義了。\expandafter延遲下一個令牌的擴展(可以是命令序列)。兩個expandafter延遲兩個週期。

相關內容