\newcommand 为 \multicolumn 的简写形式

\newcommand 为 \multicolumn 的简写形式

\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\omitMisplaced \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}

相关内容