
Considere este MWE:
\documentclass[11pt]{book}
\def\entrytest{WORD}
\def\entrycurrent{NOWORD}
% \def\entrycurrent{WORD}
\ifx\entrytest\entrycurrent
\newif\ifsomething
\somethingfalse
\fi
\ifx\entrytest\entrycurrent
\ifsomething\typeout{Yes}\else\typeout{No}\fi
\fi
\begin{document}
\end{document}
En el caso actual, hubiera esperado que \ifsomething\typeout...
hubiera estado "protegido" por el \ifx
que lo envuelve; pero algo no está bien, porque el código se detiene con:
...
No
! Extra \fi.
l.15 \fi
?
Por supuesto, si es \def\entrycurrent{WORD}
así, todos los \ifx
mensajes de correo electrónico se ejecutan en la rama "verdadera", entonces todo funciona como se esperaba.
Entonces, ¿cómo debo manejar los usos de \newif
s que pueden haber sido definidos condicionalmente?
Respuesta1
En el segundo \ifx\entrytest\entrycurrent
, \ifsomething
no está definido, por lo que elprimero \fi
partidos \ifx
y el segundo \fi
está fuera de lugar.
No es el nombre de la macro lo que hace que algo sea condicional; sólo una muestra que esdefinidoy es equivalente a uno de los condicionales primitivos.
lo que \newif\ifsomething
hace es
\let\ifsomething\iffalse
\def\somethingtrue{\let\ifsomething\iftrue}
\def\somethingfalse{\let\ifsomething\iffalse}
Probablemente quieras algo como
\newif\ifsomething
\somethingtrue
\ifx\entrytest\entrycurrent
\somethingfalse
\fi
\ifx\entrytest\entrycurrent
\ifsomething\typeout{Yes}\else\typeout{No}\fi
\fi
pero no está claro por qué harías esto para empezar.