可选参数会中断多列命令

可选参数会中断多列命令

我有一个命令用于在表格中创建格式化的标题条目。大多数表格标题条目跨越 1 列,但其他条目跨越多列,因此我使用可选的宽度参数按如下方式定义了该命令。但是,这无法编译。它给出了 Misplaced \omit 错误。

\documentclass{article}
\newcommand{\hform}[2][1]{\multicolumn{#1}{|c|}{\textbf{#2}}}
\begin{document}
\begin{tabular}{|c|c|}
  \hline
  \hform[2]{Title}\\\hline
  \hform{Col 1} & \hform{Col 2} \\\hline
  blah & blah\\
  blah & blah\\
  \hline
\end{tabular}
\end{document}

错误信息:

! Misplaced \omit.
\multispan ->\omit 
                   \@multispan 
l.13   \hform[2]{Title}
                       \\\hline
? 

但是,当我删除可选参数并使其成为强制参数时,它确实会编译。

\documentclass{article}
\newcommand{\hform}[2]{\multicolumn{#1}{|c|}{\textbf{#2}}}
\begin{document}
\begin{tabular}{|c|c|}
  \hline
  \hform{2}{Title}\\\hline
  \hform{1}{Col 1} & \hform{1}{Col 2} \\\hline
  blah & blah\\
  blah & blah\\
  \hline
\end{tabular}
\end{document}

这是为什么?我做错了什么?在我的计算机上,这是一个(相当)最小的工作示例,却产生了这个问题。

答案1

仅限由以下项定义的命令扩张可以位于触发列跨越的\omit\span基元之前。如果看到任何不可扩展的标记,则单元格将正常启动。LaTeX 在测试时使用一些不可扩展的构造[

因此,您需要使参数非可选,或者您可以使用包xparse,它\DeclareExpandableDocumentCommand使用更复杂但可扩展的测试来测试可选参数。

\documentclass{article}
\usepackage{xparse}
\DeclareExpandableDocumentCommand{\hform}{O{1}m}{\multicolumn{#1}{|c|}{\textbf{#2}}}
\begin{document}
\begin{tabular}{|c|c|}
  \hline
  \hform[2]{Title}\\\hline
  \hform{Col 1} & \hform{Col 2} \\\hline
  blah & blah\\
  blah & blah\\
  \hline
\end{tabular}
\end{document}

相关内容