\meaning\hline

\meaning\hline

回顾一下\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 重新进行对齐。

为什么不使用\bgroupand \egroup?它们在这里可以工作,但最好使用这些显式括号,以免 case\hline过早展开,从而欺骗括号计数器认为它们是成对出现的。

相关内容