当我想用测试控制表格的显示时,我遇到了各种问题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 \\ \hline}
\end{tabular}
}
\begin{document}
\essai{coucou}
\end{document}
如果我调用\essai{hallo}
,则ifthenelse
测试为false
,并且它会编译:表格的第二行有 2 列,正如预期的那样。如果我调用\essai{coucou}
,则测试为true
,并且我期望有多列行。但它给出了编译错误Misplaced \omit...
答案1
\multicolumn
在扩展命令之后,必须是 TeX 在表格单元格中看到的第一件事;不幸的是,当测试计算为假时,它会\ifthenelse
在之前留下一些东西。\multicolumn
使用不同的测试命令:在这种情况下,\ifboolexpe
从etoolbox
(注意最后的“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 \\ \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 \\ \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 \\ \hline}
\end{NiceTabular}
}
\begin{document}
\essai{coucou}
\end{document}