ifthenelse 中的多列变得未对齐

ifthenelse 中的多列变得未对齐

我想编写一个命令来生成一个表格,但也可以添加一个包含可选参数内容的多列。我尝试使用来ifthenelse检查可选参数是否为空,但多列周围的括号会给我带来错误mispaced \omit,并导致列错位。

该命令如下所示:

\newcommand{\namecol}[1][]{
\begin{table}[h!]
\begin{tabular}{|rlrl|}
    \ifthenelse{\equal{#1}{}}{}{%
        \multicolumn{4}{|l|}{#1} \\
    }
    a & b & c & d \\
    e & f & g & h \\
\end{tabular}
\end{table}
}

\namecol下面分别是调用和的结果\namecol[x]

多列错位

答案1

这符合你的期望吗?

\documentclass{article}
\begin{document}
\newcommand{\namecol}[1][\relax]{
\begin{table}[h!]
\begin{tabular}{|rlrl|}
    \ifx\relax#1\relax\else
        \multicolumn{4}{|l|}{#1} \\
        \fi
    a & b & c & d \\
    e & f & g & h \\
\end{tabular}
\end{table}
}

\namecol

\namecol[x]

\end{document}

在此处输入图片描述

答案2

问题在于,它\multicolumn必须是单元格中的第一个对象(宏扩展之后),但却\ifthenelse插入了其他东西,当\multicolumn最终找到它时,已经太晚了。

一种更简单的方法是使用xparse,我们可以使用可扩展测试来测试是否给出了可选参数\IfValueT

\documentclass{article}
\usepackage{xparse} % not needed if using LaTeX released on or after 2020-10-01

\NewDocumentCommand{\namecol}{o}{%
  \begin{table}[htp!]% <--- not just h!
  \begin{tabular}{|rlrl|}
  \IfValueT{#1}{\multicolumn{4}{|l|}{#1} \\}
  a & b & c & d \\
  e & f & g & h \\
  \end{tabular}
  \end{table}
}

\begin{document}

\namecol

\namecol[x]

\end{document}

在此处输入图片描述

相关内容