编辑

编辑

我正在尝试使用宏来定义表格行,该宏将根据给定的参数执行表格行的条件定义。请考虑以下 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}

\@firstoftwo 和 \@secondoftwo 起什么作用?了解更多信息。

答案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}

给你:

在此处输入图片描述

相关内容