当表格内容为 \input 时,colortbl 有不同的行为

当表格内容为 \input 时,colortbl 有不同的行为

我正在排版一个由外部程序创建的内容的复杂表格。当我使用时,\input我得到了意想不到的行为\rowcolor。请参阅下面的 MWE

\documentclass{article}
\usepackage{xcolor}
\usepackage{colortbl}
\begin{document}
Works\par
\begin{tabular}{ll}
  \rowcolor{blue!20}%
  A & B
\end{tabular}

Doesn't work\par
\begin{tabular}{ll}
  % Uncomment line below to get the unexpected behavior
  %\input{mwe-bit.tex}
\end{tabular}
\end{document}

其中mwe-bit.tex仅包含

\rowcolor{blue!20}%
A & B

与上面直接包含的两行相同。当我运行此代码时,第一部分可以正常工作,但第二部分会生成(取消注释时):

! Misplaced \noalign.
\rowcolor ->\noalign 
                     {\ifnum 0=`}\fi \global \let \CT@do@color \CT@@do@color...
l.1 \rowcolor
             {blue!20}

我出于谨慎考虑在%后面添加了\rowcolor,但似乎并没有什么区别。

我对在此发帖仍是一个新手,因此对于任何失误我深表歉意。

(更新,原始帖子对每次尝试都有一对\rowcolor说明。我一直以为这与更改已指定的颜色有关,但实际上,只要在输入的文件中有一个就足以产生错误)

答案1

如果必须服从\rowcolor,则需要将第一个表格行从\input文件中移除(或执行其他操作,例如将表格前言也放入文件中\input)。这是因为\rowcolor扩展为标记,其中之一是\noalign,并且\noalign只能在 TeX 对齐(例如制表)中非常特定的地方发生。请参阅这里以获得关于此的详细解释(这也在下面解释)。

以下工作:

主要.tex:

\documentclass{article}
\usepackage{xcolor}
\usepackage{colortbl}
\begin{document}
Works\par
\begin{tabular}{ll}
  \rowcolor{blue!20}%
  A & B
\end{tabular}

Also works\par
\begin{tabular}{ll}
  \rowcolor{green!20}% first line must be colored out of the \input file
  foobar
  \input{mwe-bit.tex}
\end{tabular}
\end{document}

mwe-bit.tex:

\\
\rowcolor{blue!20}%
A & B

截屏

在你的情况下,你会得到可怕的“放错位置\noalign”错误,因为\input执行\@ifnextchar,它会执行\let(至少,这是发生此错误的原因;可能还有其他非常类似的错误,例如,来自除 之外的某些命令\@ifnextchar)。\let作为不可扩展、非空格标记,TeX 在查找\noalign\omit位于表格开头或表格行结尾之后(在表格内部使用的\cr\crcr命令之后)时停止标记扩展。因此,它\rowcolor此时不会扩展,当它最终扩展时,它已经在处理第一个表格条目内容,其中\noalign无效。\noalign仅在特殊扩展步骤期间有效寻找\noalign或在表格1\omit的开头或在或之后,特殊步骤停止在第一个不可扩展、非空间标记处。\cr\crcr

我的示例有效,因为:

  1. 表格最开始的第一个\rowcolor标记在刚才描述的“特殊步骤”中得到扩展,而第一个不可扩展、非空间的标记是\noalign(来自\rowcolor的定义),它允许\rowcolor按设计工作。

  2. mwe-bit.tex 中的其他\rowcolor命令紧随其后\\,如果我们查看 tabular 中的定义\\,它可能与没有太大区别\crcr(我猜有一个\unskip之前,但“之前”的内容不会引起任何问题:重要的是\cr\crcr\noalign材料之间有什么)。当执行由 启动的“特殊扩展步骤”时,TeX 在到达来自\\之前找不到中间的不可扩展、非空格标记;因此这个也可以按设计工作(即将颜色材料放在它所属的位置)。\noalign\rowcolor\special


脚注

  1. 更一般地,TeX 对齐如\halign\valign

相关内容