为什么 \hline 应该是表格行中的第一个指令?

为什么 \hline 应该是表格行中的第一个指令?

在调试宏时,我发现了这种奇怪的行为(奇怪的是,我的意思是我没有能力理解为什么它会这样,以及它是一个错误还是一个功能......)。

本 MWE 编译:

\documentclass{article}
\usepackage{expl3}


\ExplSyntaxOn

\cs_new:Npn\mytable:n {
  \begin{tabular}{c}
    \hline
    test \\
    \hline
  \end{tabular}
}

\newcommand{\mytable}{\mytable:n}

\ExplSyntaxOff

\begin{document}
  \mytable
\end{document}

但是这个不会:

\documentclass{article}
\usepackage{expl3}


\ExplSyntaxOn

\cs_new:Npn\mytable:n {
  \begin{tabular}{c}
    \bool_set_true:N\myvar % <--- Here the change
    \hline
    test \\
    \hline
  \end{tabular}
}

\newcommand{\mytable}{\mytable:n}

\ExplSyntaxOff

\begin{document}
  \mytable
\end{document}

我的直觉告诉我,除了定义一些其他宏或在寄存器中存储一些标记外,该\bool_set_true:N函数不会对输入/输出做任何有意义的事情,但我想这证明我错了......有人可以给我提供更好的直觉吗?

笔记:阅读评论后,\hline\def等)之前的任何内容都会引发问题)

答案1

\hline使用名为 的 TeX 基元\noalign,它仅当它是表格行中的第一个(不可扩展)标记时才有效。\bool_set_true:N执行赋值,因此它不可扩展并在那里中断。使用(赋值)或(不可扩展标记)或(不可扩展标记)\hline时,您会得到相同的错误:\def\x{} \hline\relax \hline\relaxa \hlinea

\documentclass{article}
\begin{document}

\begin{tabular}{c}
  % \def\x{} \hline
  % \relax \hline
  % a \hline
  \hline
  test \\
  \hline
\end{tabular}

\end{document}

如果你真的想把作业放在那里,你可以把它放在那里里面 \noalign(同一行中可以有多个\noaligns)。请注意,分配必须是全局的,否则在\noalign结束时会恢复:

\documentclass{article}
\begin{document}

\ExplSyntaxOn
\bool_show:N \g_tmpa_bool
\begin{tabular}{c}
  \noalign{ \bool_gset_true:N \g_tmpa_bool }
  \hline
  test \\
  \hline
\end{tabular}
\bool_show:N \g_tmpa_bool

\end{document}

相关内容