テキストを重複せずに繰り返すにはどうすればよいでしょうか?

テキストを重複せずに繰り返すにはどうすればよいでしょうか?

ドキュメントに「要件」を記述するためのコマンドを定義しました。このコマンドは、自動的にスタイルと番号を設定し、番号を取得するために参照できるラベルを作成します。非常に便利です。ただし、参照するときに要件の全文を繰り返したい場合があります。そうすれば、読者はドキュメント内を戻らなくても済みます。もちろん、1 か所を変更するとエラーが発生しやすくなるため、書き直したくはありません。コマンドを使用してテキストを繰り返すにはどうすればよいですか?

現在のコマンド定義の形式は次のとおりです。

\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

とだけ記述すると、 が 1 つしかない(および が欠落している) ため、\def\csname req#2\endcsname {<definition>}再定義が試行され\csname、エラーが発生します。\endcsname\

\expandafterの前に置くと\def

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

なる

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

そして、定義されました。\expandafter次のトークンの展開を遅らせます (コマンド シーケンスにすることができます)。2 つの expandafter は 2 サイクル遅延します。

関連情報