
Actualmente estoy jugando con macros (bastante nuevas) y parece que me falta algo bastante básico sobre las macros LaTeX/TeX:
\def\car{Yes}
\def\iszero#1{
\ifnum#1=0{
\let \car = Yes
}
\else{
\let \car = No
}
\car
}
\iszero{1}
Devoluciones Sí.
Me preguntaba por qué sucede esto y cómo puedo evitar que LaTeX reemplace prematuramente \car
su valor actual.
Respuesta1
Quieres
\def\car{Yes}
\def\iszero#1{%
\ifnum#1=0 % Terminate number with a space
\def\car{Yes}%
\else
\def\car{No}%
\fi
}
\iszero{1}
Estás usando un condicional primitivo TeX, por lo que las dos ramas sonnolugares entre llaves: en cambio, están delimitados por el final del condicional, el \else
y el \fi
. La \let
primitiva sólo se puede utilizar para asignar un token al valor de un segundo: no se puede utilizar para definir una macro, que necesita \def
.
Respuesta2
La sintaxis de los condicionales TeX no utiliza llaves para las ramas verdadero y falso.
También \let
se comporta de manera diferente a lo que parece pensar: \let\foo=<token>
hace \foo
(casi) equivalente a <token>
. En el caso de
\let\car = Yes
el token Y
se asignaría \car
y es
se imprimiría (si está en la rama no omitida); igual por \let\car = No
.
Deberías usar \def
, en su lugar. Pero hay mejores formas que no requieren tener \car
.
Suponiendo TeX simple,
\long\def\firstoftwo#1#2{#1}
\long\def\secondoftwo#1#2{#2}
\def\iszero#1{%
\ifnum#1=0
\expandafter\firstoftwo
\else
\expandafter\secondoftwo
\fi
{Yes}{No}%
}
funcionaría: el \expandafter
truco elimina los restos del texto condicional, dejando \firstoftwo{Yes}{No}
o \secondoftwo{Yes}{No}
en el flujo de entrada.
Esto se puede generalizar
\def\IfIsZeroTF#1{%
\ifnum#1=0
\expandafter\firstoftwo
\else
\expandafter\secondoftwo
\fi
}
ser llamado como
\IfIsZeroTF{1}{Yes}{No}
Respuesta3
Alternativamente, coloque la comparación dentro de la definición de \car
.
%\def\car{Yes}%% Not needed for this example
\def\iszero#1{%
\edef\car{%
\ifnum#1=0
Yes%
\else
No%
\fi
}}
False: \iszero{1}\car
True: \iszero{0}\car
Yo suelo \edef
entrar solo Yes
o No
dentro \car
. Si \def
se utiliza, existe el riesgo de que la entrada se cambie antes de evaluarse, por ejemplo, si la entrada es un contador.