\ifthenelse 不执行任何操作

\ifthenelse 不执行任何操作

我想将表定义为命令。只有当某些行有值时,才会打印这些行。因此,我使用了命令\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}

在此处输入图片描述

这种方法的缺点是您需要为不同类型的条件定义几个专门的命令。

相关内容