
He definido un comando para escribir "requisitos" en mi documento. Automáticamente le da estilo, lo numera y crea una etiqueta a la que puedo referirme para obtener el número, realmente agradable. Sin embargo, a veces quiero repetir el texto completo del requisito al hacer referencia a él, para que el lector no tenga que retroceder en el documento. Por supuesto, no quiero reescribirlo, porque sería propenso a errores cuando lo cambie en un solo lugar. ¿Cómo puedo repetir el texto usando un comando?
La forma actual de mi definición de comando es la siguiente:
\newcommand{\requirement}[2]{
\vspace{10pt}
\noindent
\textbf{
\refstepcounter{reqnum}
\label{req:#2}
R\thereqnum: #1
}
}
Probé muchas variaciones del siguiente intento, sin éxito:
\newcommand{\requirement}[2]{
\vspace{10pt}
\noindent
\textbf{
\refstepcounter{reqnum}
\label{req:#2}
R\thereqnum: #1
}
\newcommand{\req{#2}}{#1}
}
Respuesta1
Está el \csname <string>\endcsname
, que emite un comando \<string>
. También puede utilizar las macros de etoolbox, que son muy cómodas de utilizar.
Si lo reemplaza \newcommand{\req{#2}}{#1}
con \expandafter\def\csname req#2\endcsname {#1}
, debería funcionar.
\def\name
define una macro \name
. No pregunta, al contrario de \newcommand
, si ya existe. Entonces sobrescribe \name
, si \name
ya existe. Esto puede resultar útil, pero normalmente es perjudicial.
Si escribe solo \def\csname req#2\endcsname {<definition>}
, intenta redefinir \csname
y arroja un error, porque hay uno solo \endcsname
(y falta un \
).
Si pones \expandafter
antes \def
,
\expandafter\def\csname req#2\endcsname {<definition>}
se convierte
\def\req<argument2> {<definition>}
y tada, está definido. \expandafter
retrasa la expansión del siguiente token (puede ser una secuencia de comando). Dos expandafters se retrasan durante dos ciclos.