在 longtable(或 tabular)环境中使用 \if@xxx 时出现问题

在 longtable(或 tabular)环境中使用 \if@xxx 时出现问题

我检查了几个问题(1234\if) 关于a longtable(或) 环境中的问题tabular,但我还没有变得更聪明。我确实有以下 MWE:

\documentclass{article}

% some code normally residing in a .sty package
\usepackage{longtable}
\usepackage{array}
\makeatletter
\newif\if@test\@testtrue
% [[A
% \newcommand{\thisline}[2]{\if@test\else{ \\ #1 & #2 }\fi}
% \newcommand{\thatline}[2]{\if@test \\ #1 & #2 \else\fi}
% ]] XOR [[B
\newcommand{\thisline}[2]{\if@test\else \\ #1 & #2 \fi}
\newcommand{\thatline}[2]{\if@test{ \\ #1 & #2 }\else\fi}
\@testfalse
% ]]

% user-space code
\begin{document}
\begin{longtable}{ll}
  \thisline{a}{b}
  \thatline{c}{d}
\end{longtable}
\end{document}

代码的工作原理如下。但是,如果我设置了\@testfalse,我必须使用块 B 而不是块 A。否则,我要么得到“缺失 } 插入”或者“不完整 \iftrue;第 X 行之后的所有文本均被忽略”错误。显然,我只想要块 A 或 B 中的一个。那么,我需要做什么才能正确屏蔽&(或者\\,如果这是问题所在)?

答案1

在此处输入图片描述

您显示的错误不是来自条件,而是来自您{在一行中开始一个组并试图在下一行结束它:

{ a & b \\}

如果没有该组,你就会得到预期的效果:

\documentclass{article}
\makeatletter
\newif\if@test\@testtrue
% \@testfalse
\begin{document}
\begin{tabular}{ll}
  % \if@test\else a & b \\ \fi
  \if@test\else a & b \\ \fi
  \if@test        c & d \\ \else\fi
\end{tabular}

\@testfalse

\begin{tabular}{ll}
  % \if@test\else a & b \\ \fi
  \if@test\else a & b \\ \fi
  \if@test        c & d \\ \else\fi
\end{tabular}

\end{document} 

问题澄清后,我怀疑你正在寻找类似的东西

\@testfalse在此处输入图片描述

没有\@testfalse在此处输入图片描述

\documentclass{article}
\usepackage{longtable}
\usepackage{array}
\makeatletter
\newif\if@test\@testtrue
\newcommand{\thisline}[2]{\if@test\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi{}{ \\ #1 & #2 }}
\newcommand{\thatline}[2]{\if@test\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi{ \\ #1 & #2 }{}}
\@testfalse % <-- un-/comment

\begin{document}
\begin{longtable}{ll}
\thisline{a}{b}
\thatline{c}{d}
\end{longtable}
\end{document}

相关内容