
Eu defini um comando para anotar 'requisitos' em meu documento. Ele estiliza e numera automaticamente e cria um rótulo ao qual posso me referir para obter o número - muito bom. Porém, às vezes quero repetir o texto completo do requisito ao me referir a ele, para que o leitor não precise voltar atrás no documento. É claro que não quero reescrevê-lo, porque isso estaria sujeito a erros quando eu o alterasse em um só lugar. Como posso repetir o texto usando um comando?
A forma atual da minha definição de comando é a seguinte:
\newcommand{\requirement}[2]{
\vspace{10pt}
\noindent
\textbf{
\refstepcounter{reqnum}
\label{req:#2}
R\thereqnum: #1
}
}
Tentei muitas variações da seguinte tentativa, sem sucesso:
\newcommand{\requirement}[2]{
\vspace{10pt}
\noindent
\textbf{
\refstepcounter{reqnum}
\label{req:#2}
R\thereqnum: #1
}
\newcommand{\req{#2}}{#1}
}
Responder1
Existe o \csname <string>\endcsname
, que faz um comando \<string>
. Você também pode usar as macros do etoolbox, que são muito convenientes de usar.
Se você substituir \newcommand{\req{#2}}{#1}
por \expandafter\def\csname req#2\endcsname {#1}
, deve funcionar.
\def\name
define uma macro \name
. Não pergunta, ao contrário \newcommand
, se já existe. Portanto, ele substitui \name
, se \name
já existir. Isso pode ser útil, mas geralmente é prejudicial.
Se você escrever apenas \def\csname req#2\endcsname {<definition>}
, ele tentará redefinir \csname
e gerará um erro, porque há um solitário \endcsname
(e um ausente \
).
Se você colocar \expandafter
antes \def
,
\expandafter\def\csname req#2\endcsname {<definition>}
torna-se
\def\req<argument2> {<definition>}
e tada, está definido. \expandafter
atrasa a expansão do próximo token (pode ser uma sequência de comando). Dois expandafters atrasam por dois ciclos.