回顾一下\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
and \egroup
?它们在这里可以工作,但最好使用这些显式括号,以免 case\hline
过早展开,从而欺骗括号计数器认为它们是成对出现的。