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