
Я определил команду для записи «требований» в моем документе. Она автоматически стилизует и нумерует их и создает метку, к которой я могу обратиться, чтобы получить номер — очень здорово. Однако иногда я хочу повторить полный текст требования при ссылке на него, чтобы читателю не приходилось возвращаться к документу. Я, конечно, не хочу переписывать его, потому что это может привести к ошибкам, если я изменю его в одном месте. Как я могу повторить текст с помощью команды?
Текущая форма определения моей команды выглядит следующим образом:
\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 задерживают на два цикла.