我正在排版一个由外部程序创建的内容的复杂表格。当我使用时,\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
我的示例有效,因为:
表格最开始的第一个
\rowcolor
标记在刚才描述的“特殊步骤”中得到扩展,而第一个不可扩展、非空间的标记是\noalign
(来自\rowcolor
的定义),它允许\rowcolor
按设计工作。mwe-bit.tex 中的其他
\rowcolor
命令紧随其后\\
,如果我们查看 tabular 中的定义\\
,它可能与没有太大区别\crcr
(我猜有一个\unskip
之前,但“之前”的内容不会引起任何问题:重要的是\cr
或\crcr
和\noalign
材料之间有什么)。当执行由 启动的“特殊扩展步骤”时,TeX 在到达来自\\
之前找不到中间的不可扩展、非空格标记;因此这个也可以按设计工作(即将颜色材料放在它所属的位置)。\noalign
\rowcolor
\special
脚注
- 更一般地,TeX 对齐如
\halign
或\valign
。