
Al mirar \hline
, me encontré con un par de piezas complejas:
\meaning\hline
macro:->\noalign {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth \futurelet
\reserved@a \@xhline
\meaning\@xhline
macro:->\ifx \reserved@a \hline \vskip \doublerulesep
\vskip -\arrayrulewidth \fi \ifnum 0=`{\fi }
Parece que el \@xhline
código está cerrando el \ifnum
condicional. ¿Alguien podría dar una explicación de lo que está pasando con{\ifnum 0=`}
Respuesta1
Aquí está la definición en el archivo fuente.
% latex.ltx, line 5351:
\def\hline{%
\noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet
\reserved@a\@xhline}
\def\@xhline{\ifx\reserved@a\hline
\vskip\doublerulesep
\vskip-\arrayrulewidth
\fi
\ifnum0=`{\fi}}
La responsabilidad de \hline
es añadir una norma horizontal y esperar otra \hline
. Para hacer esto, TeX se coloca temporalmente fuera de la alineación, con la ayuda de \noalign
. El código
\noalign{\ifnum0=`}\fi
abre la lista de tokens para \noalign
y la llave de cierre no se ve porque es parte de una prueba numérica que devuelve falso. TeX expande los tokens a medida que avanza, realiza las tareas necesarias; en particular, \hrule
se ejecuta y luego \futurelet
se llama para ver si \hline
sigue otro comando (para agregar un pequeño espacio vertical). Finalmente
\ifnum0=`{\fi}
se encuentra, lo que cierra la lista de tokens \noalign
y hace que TeX vuelva a realizar la alineación.
¿Por qué no \bgroup
y \egroup
? Funcionarían aquí, pero es preferible tener esas llaves explícitas en caso de que \hline
se expandan prematuramente para que el contador de llaves se engañe y piense que aparecen en un par.