\ifthenelse + multicolumn 的问题

\ifthenelse + multicolumn 的问题

当我想用测试控制表格的显示时,我遇到了各种问题ifthenelse。例如,考虑以下 M(non)WE :

\documentclass{article}
\usepackage{multirow}
\usepackage{ifthen}
\newcommand{\essai}[1]{
\begin{tabular}{cc}
    a&b \\ \hline
    \ifthenelse{\equal{#1}{coucou}}{\multicolumn{2}{|c|}{oui - #1} \\ \hline}{non&#1 \\ \hline} 
\end{tabular}
}
\begin{document}
  \essai{coucou}
\end{document}

如果我调用\essai{hallo},则ifthenelse测试为false,并且它会编译:表格的第二行有 2 列,正如预期的那样。如果我调用\essai{coucou},则测试为true,并且我期望有多列行。但它给出了编译错误Misplaced \omit...

答案1

\multicolumn在扩展命令之后,必须是 TeX 在表格单元格中看到的第一件事;不幸的是,当测试计算为假时,它会\ifthenelse在之前留下一些东西。\multicolumn

使用不同的测试命令:在这种情况下,\ifboolexpeetoolbox(注意最后的“e”)开始,可能看起来很有希望。

etoolbox不幸的是,实现字符串相等性测试的方式也导致了在 TeX 能够看到之前无法扩展的命令\multicolumn,因此必须使用直接方法:

\documentclass{article}
\makeatletter
\newcommand{\roystreqtest}[2]{%
  \ifnum\pdfstrcmp{#1}{#2}=\z@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother
\newcommand{\essai}[1]{%
  \begin{tabular}{cc}
  a&b \\ \hline
  \roystreqtest{#1}{coucou}%
    {\multicolumn{2}{|c|}{oui - #1} \\ \hline}
    {non&#1 \\ \hline} 
  \end{tabular}%
}

\begin{document}
\essai{coucou}

\essai{noncoucou}
\end{document}

如果你必须比较不是仅由 ASCII 可打印字符组成的字符串,那么更安全的说法是

\newcommand{\roystreqtest}[2]{%
  \ifnum\pdfstrcmp{\detokenize{#1}}{\detokenize{#2}}=\z@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}

如果你够大胆,你可以使用已经定义好的基础结构:LaTeX3 为字符串提供了可扩展的相等性测试:可以\roystreqtest这样定义

\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \roystreqtest \str_if_eq:nnTF
\ExplSyntaxOff

其余都一样。

答案2

如果您是老手,不使用 e* 工具,那么您需要隐藏 TeX 对齐扫描仪的条件。这通常很棘手,但如果你知道你的测试总是一行中的第一个(即总是在一行中的第一个单元格中),那么你可以在 a 中进行测试\noalign并得出适当定义的临时宏。

这似乎适用于你的例子

\documentclass{article}
\usepackage{multirow}
\usepackage{ifthen}
\newcommand{\essai}[1]{
\begin{tabular}{cc}
    a&b \\ \hline
\noalign{%
    \ifthenelse{\equal{#1}{coucou}}%
        {\gdef\hmm{\multicolumn{2}{|c|}{oui - #1} \\ \hline}}%
        {\gdef\hmm{non&#1 \\ \hline}}%
}\hmm 
\end{tabular}
}
\begin{document}

  \essai{coucou}

  \essai{xoucou}


\end{document}

答案3

您可以在以下位置进行测试\table

\ifthenelse{\boolean{expr}}
    {\gdef\temp{\multicolumn{...}}}
    {\gdef\temp{something else}}
...
\begin{tabular}{..}
...\\
\temp
...

答案4

{NiceTabular}的环境nicematrix提供了一个命令\Block,其功能与\multicolumn和类似\multirow

\Block里面使用没有问题\ifthenelse

\documentclass{article}
\usepackage{ifthen}
\usepackage{nicematrix}

\newcommand{\essai}[1]{
\begin{NiceTabular}{cc}
    text & text \\ \hline
    \ifthenelse{\equal{#1}{coucou}}{\Block{1-2}{oui - #1} \\ \hline} {non&#1 \\ \hline} 
\end{NiceTabular}
}
\begin{document}
  \essai{coucou}
\end{document}

相关内容