我检查了几个问题(1,2,3,4\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}
问题澄清后,我怀疑你正在寻找类似的东西
\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}