我正在尝试使用宏来定义表格行,该宏将根据给定的参数执行表格行的条件定义。请考虑以下 MWE:
\documentclass{article}
\newcommand{\test}[3]{
\ifnum\numexpr#1\relax=0
#2 & %#3
\else
#2 & #3
\fi
}
\begin{document}
\begin{tabular}{ll}
\test{0}{col1-1}{col1-2} \\
\test{1}{col2-1}{col2-2} \\
\end{tabular}
\end{document}
#2 & %#3
删除第五行( ⟶ )的注释#2 & #3
会导致错误消息Incomplete \ifnum; all text was ignored after line 14
。即使在网上搜索了几个小时,我还是无法解决这个问题。
我究竟做错了什么?
编辑
@大卫·卡莱尔,@egreg, 和@弗朗西斯: 非常感谢大家的回答。我尝试了你们所有的例子,它们都解决了我的问题。虽然我认为@egreg是正式的准确方法,我认为解决方案是@大卫·卡莱尔为了简单和简洁起见,对我的用例来说更加优雅,同时考虑答案@弗朗西斯作为一种解决方法。所以我决定标记答案@大卫·卡莱尔作为被接受的答案,而不想忽视其他答案。
非常感谢您的帮助!
答案1
您可以跳过&
条件,只需稍微隐藏一下即可。
\documentclass{article}
\newcommand{\test}[3]{%
\ifnum\numexpr#1\relax=0
AA#2 \uppercase{&} BB#3
\else
CC#2 \uppercase{&} DD#3
\fi
}
\begin{document}
\begin{tabular}{l|l}
\test{0}{col1-1}{col1-2} \\
\test{1}{col2-1}{col2-2} \\
\end{tabular}
\end{document}
答案2
您不能在表格单元格中开始一个条件并在另一个单元格中结束它,因为 TeX 会插入一个不可访问的标记来表示单元格的结束,而这在条件中跳过的文本中是不允许的。
通常的技巧是完成所有条件,然后执行以下两个代码之一:
\documentclass{article}
\makeatletter
\newcommand{\test}[3]{%
\ifnum\numexpr#1\relax=0
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#2 & }
{#2 & #3}
}
\makeatother
\begin{document}
\begin{tabular}{ll}
\test{0}{col1-1}{col1-2} \\
\test{1}{col2-1}{col2-2} \\
\end{tabular}
\end{document}
答案3
在表格环境中&
不能跳过,所以当你的条件为真时,LaTeX 会执行以下操作:它会扫描#2 & #3
,然后当遇到\else
扩展时停止,但是,当&
满足第二个时,表格环境会再次开始扩展,因此输出变为#2 & #3 & #3
。可以通过构建新的控制序列来修复它,例如:
\documentclass{article}
\newcommand{\testa}[2]{#1 & #2}
\newcommand{\testb}[2]{#1 & #2}
\newcommand{\test}[3]{
\ifnum\numexpr#1\relax=0
\testa{#2}{#3}
\else
\testb{#2}{#3}
\fi
}
\begin{document}
\begin{tabular}{ll}
\test{0}{A}{B} \\
\test{1}{B}{A} \\
\end{tabular}
\end{document}
给你: