我想将表定义为命令。只有当某些行有值时,才会打印这些行。因此,我使用了命令\ifthenelse
。
例子:
\begin{tabularx}{\linewidth}{|l|X|}
\hline
Titel & #1\\ \hline
Caption & #2\\ \hline
\ifthenelse{\equal{#3}{}}{}{Priority & #3\\ \hline}
\ifthenelse{\equal{#4}{}}{}{Members & #4\\ \hline}
\end{tabularx}
但有一个问题:如果我将第二个括号留空\ifthenelse
,则会打印一个空格符号。通常你不会看到它。但是它tabularx
知道有一个符号,并为这个符号创建一个新行。两个软件包ifthen
都有xifthen
这个问题。
如何避免\ifthenelse
产生空格符号?
答案1
存在更好的替代方案,\ifthenelse
且不存在这个问题。
你可以\ifthenelse{\equal{#3}{}}{<empty>}{<not empty>}
使用
\ifstrempty{#3}{}{Priority & #3\\ \hline}
\ifstrempty{{#4}}{}{Members & #4\\ \hline}
这需要\usepackage{etoolbox}
。
另一种可能性:
\documentclass{article}
\usepackage{xparse}
\usepackage{tabularx}
% see https://tex.stackexchange.com/a/467527/4427
\ExplSyntaxOn
\NewExpandableDocumentCommand{\xifthenelse}{mmm}
{
\bool_if:nTF { #1 } { #2 } { #3 }
}
\cs_new_eq:NN \numtest \int_compare_p:n
\cs_new_eq:NN \oddtest \int_if_odd_p:n
\cs_new_eq:NN \dimtest \dim_compare_p:n
\cs_new_eq:NN \deftest \cs_if_exist_p:N
\cs_new_eq:NN \namedeftest \cs_if_exist_p:c
\cs_new_eq:NN \eqdeftest \token_if_eq_meaning_p:NN
\cs_new_eq:NN \streqtest \str_if_eq_p:ee
\cs_new_eq:NN \emptytest \tl_if_blank_p:n
\prg_new_conditional:Nnn \xxifthen_legacy_conditional:n { p,T,F,TF }
{
\use:c { if#1 } \prg_return_true: \else: \prg_return_false: \fi:
}
\cs_new_eq:NN \boolean \xxifthen_legacy_conditional_p:n
\ExplSyntaxOff
\newcommand{\ahrtable}[4]{%
\par\noindent
\begin{tabularx}{\linewidth}{|l|X|}
\hline
Title & #1\\ \hline
Caption & #2\\ \hline
\xifthenelse{\emptytest{#3}}{}{Priority & #3\\ \hline}
\xifthenelse{\emptytest{#4}}{}{Members & #4\\ \hline}
\end{tabularx}%
}
\begin{document}
\ahrtable{Title}{Caption}{}{}
\bigskip
\ahrtable{Title}{Caption}{Priority}{}
\bigskip
\ahrtable{Title}{Caption}{}{Members}
\bigskip
\ahrtable{Title}{Caption}{Priority}{Members}
\end{document}
答案2
由于没有提供测试文档,因此这是未经测试的,但基本上您可以在结束上一行之前进行测试:
\begin{tabularx}{\linewidth}{|l|X|}
\hline
Titel & #1\\ \hline
Caption & #2%
\ifthenelse{\equal{#3}{}}{}{\\ \hline Priority & #3}%
\ifthenelse{\equal{#4}{}}{}{\\ \hline Members & #4}\\ \hline
\end{tabularx}
答案3
我不完全确定为什么\ifthenelse
扩展会在输出中创建额外的空格,但这似乎与它不是完全可扩展,即内部使用作业。
当你定义一个\ifequal
实际上完全扩展的类似命令时,额外的输出就消失了:
\documentclass{article}
\usepackage{tabularx}
\usepackage{xifthen}
\newcommand\ifequal[4]{\ifnum\pdfstrcmp{#1}{#2}=0 #3\else #4\fi}
\parindent=0pt
\begin{document}
\begin{tabularx}{\linewidth}{|l|X|}
\hline
Titel & 1\\ \hline
Caption & 2\\ \hline
\ifequal{}{}{}{Priority & 3\\ \hline}
\ifequal{}{}{}{Members & 4\\ \hline}
\end{tabularx}
\begin{tabularx}{\linewidth}{|l|X|}
\hline
Titel & 1\\ \hline
Caption & 2\\ \hline
\ifequal{}{}{}{Priority & 3\\ \hline}
\ifequal{y}{}{}{Members & 4\\ \hline}
\end{tabularx}
\end{document}
这种方法的缺点是您需要为不同类型的条件定义几个专门的命令。