
Глядя на \hline
, я столкнулся с парой сложных моментов:
\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 }
Кажется, \@xhline
код закрывает \ifnum
условное выражение. Может ли кто-нибудь объяснить, что происходит с{\ifnum 0=`}
решение1
Вот определение в исходном файле
% 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}}
Ответственность за \hline
добавление горизонтальной линии и ожидание другой \hline
. Для того чтобы сделать это, TeX временно выводится за пределы выравнивания с помощью \noalign
. Код
\noalign{\ifnum0=`}\fi
открывает список токенов для \noalign
, а закрывающая скобка не видна, поскольку она является частью числового теста, возвращающего false. TeX расширяет токены по мере продвижения, выполняет необходимые назначения; в частности, \hrule
выполняется, а затем \futurelet
вызывается, чтобы посмотреть, \hline
следует ли другая команда (для добавления небольшого вертикального пробела). Наконец
\ifnum0=`{\fi}
найден, что закрывает список токенов \noalign
и возвращает TeX к выполнению выравнивания.
Почему бы не \bgroup
и \egroup
? Они бы здесь сработали, но предпочтительнее иметь эти явные скобки на случай, если \hline
они будут раскрыты преждевременно, чтобы счетчик скобок думал, что они появляются в паре.