以下示例有两个常规 LaTeX\newcommand
宏和两个\NewDocumentCommand
用于指定多列文本的 xparse。每对命令之间的唯一区别是一个将对齐字符作为宏的一部分,而另一个则没有。但是,要求对齐字符位于宏之外的 xparse 版本不起作用并导致Misplaced \omit.
错误。
\documentclass{article}
\usepackage{xparse}
\newcommand{\MulticolumnA}[3]{&\multicolumn{#1}{#2}{#3}}
\newcommand{\MulticolumnB}[3]{ \multicolumn{#1}{#2}{#3}}
\NewDocumentCommand{\MulticolumnX}{m m m}{&\multicolumn{#1}{#2}{#3}}
\NewDocumentCommand{\MulticolumnY}{m m m}{ \multicolumn{#1}{#2}{#3}}
\begin{document}
\[
\begin{tabular}{lllllll}
{a} \MulticolumnA{4}{l}{A-abcdefghijkli}\\
{a}&\MulticolumnB{4}{l}{B-abcdefghijkli}\\
{a} \MulticolumnX{4}{l}{X-abcdefghijkli}\\
%{a}&\MulticolumnY{4}{l}{Y-abcdefghijkli}\\
{col1}&col2&{col3}&{col4}&{col5}\\
\end{tabular}
\]
\end{document}
以上内容可以按原样进行编译,但如果取消注释一行,则无法进行编译。
答案1
\NewDocumentCommand
通过 创建一个强大的命令\protected
。有关 e-TeX 的文档在第 14 页上说,在对齐\noalign
或时,受保护的宏不会被扩展\omit
。因此,在\MulticolumnY
之后&
,对 的搜索\omit
结束,当 TeX 扩展时,\MulticolumnY
它会找到一个放错位置的\omit
(来自\multicolumn
)。您必须\NewExpandableDocumentCommand
为此使用。
\NewExpandableDocumentCommand
已于 2017/03/11 版本中添加xparse
。之前仅\DeclareExpandableDocumentCommand
可用。
不会发生这种情况\MulticolumnX
,因为命令是不是当 TeX 寻找 时展开\omit
;它找到了&
,因此它完成表条目并开始一个新的,但现在它可以直接看到\multicolumn
并且很高兴。