Evitar que LaTeX reemplace una variable

Evitar que LaTeX reemplace una variable

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 \carsu 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 \elsey el \fi. La \letprimitiva 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 \letse 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 Yse asignaría \cary esse 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 \expandaftertruco 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 \edefentrar solo Yeso Nodentro \car. Si \defse utiliza, existe el riesgo de que la entrada se cambie antes de evaluarse, por ejemplo, si la entrada es un contador.

información relacionada