\newcommand
很多时候,用 的缩写形式进行定义会很方便\multicolumn
。为此,我测试了以下两个命令的定义:
\newcommand\my[2]{\multicolumn{1}{#1}{#2}}
\newcommand\mx[2][c]{\multicolumn{1}{#1}{#2}}
同时,第一个定义工作正常,第二个定义抛出错误:
! Misplaced \omit.
\multispan ->\omit
\@multispan
l.9 \mx{A}
& \mx[c|]{B} \\
使用以下 MWE 进行测试:
\documentclass[margin=3mm]{standalone}
\newcommand\mx[2][c]{\multicolumn{1}{#1}{#2}}
\newcommand\my[2]{\multicolumn{1}{#1}{#2}}
\begin{document}
\begin{tabular}{|c|c|}
\hline
\mx{A} & \mx[c|]{B} \\
\my{c}{A} & \my{c|}{B} \\
\hline
\end{tabular}
\end{document}
有没有办法修复定义\mx
?
答案1
\multicolumn
通过插入一个\omit
来忽略表格列模板,它之所以有效是因为在表格单元格的开头 TeX 会扩展标记(从而扩展\multicolumn
),直到找到不可扩展的标记或\omit
。
问题是,如果使用 LaTeX 定义的命令带有可选参数,则它们不可扩展,因此 TeX在寻找时\newcommand
找不到。之后,当它找到时已经太晚了,您会收到错误。\omit
\omit
Misplaced \omit
使用xparse
\NewExpandableDocumentCommand
你可以创建一个带有可选参数的命令和可扩展:
\documentclass[margin=3mm]{standalone}
\usepackage{xparse}
\NewExpandableDocumentCommand\mx{O{c}m}
{\multicolumn{1}{#1}{#2}}
\newcommand\my[2]{\multicolumn{1}{#1}{#2}}
\begin{document}
\begin{tabular}{|c|c|}
\hline
\mx{A} & \mx[c|]{B} \\
\my{c}{A} & \my{c|}{B} \\
\hline
\end{tabular}
\end{document}