Как повторить текст, не дублируя его?

Как повторить текст, не дублируя его?

Я определил команду для записи «требований» в моем документе. Она автоматически стилизует и нумерует их и создает метку, к которой я могу обратиться, чтобы получить номер — очень здорово. Однако иногда я хочу повторить полный текст требования при ссылке на него, чтобы читателю не приходилось возвращаться к документу. Я, конечно, не хочу переписывать его, потому что это может привести к ошибкам, если я изменю его в одном месте. Как я могу повторить текст с помощью команды?

Текущая форма определения моей команды выглядит следующим образом:

\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>}

и тада, это определено. \expandafterзадерживает расширение следующего токена (может быть командной последовательностью). Два expandafters задерживают на два цикла.

Связанный контент