嵌套的 if-then-else 语句

嵌套的 if-then-else 语句

我尝试使用嵌套的 if-then-else 条件:

\documentclass[10pt]{article}
\usepackage{ifthen}

\newcommand{\printTrueOrFalseA}[1]{%
   \ifthenelse{\equal{#1}{true}}{true}{false}%
}

\newcommand{\True}{true}
\newcommand{\False}{false}

\newcommand{\printTrueOrFalseB}[1]{%
   \ifx#1\True true\else false\fi%
}

\begin{document}
\printTrueOrFalseA{\printTrueOrFalseA{true}} % produces an error
\printTrueOrFalseB{\printTrueOrFalseB{true}} % produces the unexpected  result "false"
\end{document}

当我使用该\ifthenelse命令时,我的代码产生错误:

! Argument of \equal has an extra }.<inserted text>\par \printTrueOrFalseA{\printTrueOrFalseA{true}}
! Paragraph ended before \equal was complete.<to be read again>\par \printTrueOrFalseA{\printTrueOrFalseA{true}}

我期望true两种情况下的结果都是这样的。为什么它没有像我预期的那样工作?

答案1

你的\printTrueOrFalseA{\printTrueOrFalseA{true}}成为

\ifthenelse{\equal{\printTrueOrFalseA{true}}{true}{true}{false}

但是的参数\equal是非法的,因为\ifthenelse不是完全可扩展的,因此会出现错误。

你的\printTrueOrFalseB{\printTrueOrFalseB{true}}成为

\ifx\printTrueOrFalseB{true}\True true\else false\fi

\printTrueOrFalseB与进行比较{,返回 false;标记true}\True true消失,因为它们构成了 的“真分支” \ifx。这将扩展为false\fi然后\fi消失,只留下“false”作为打印输出。

答案2

以下是你可以做到的方法(无需\ifthenelse

\documentclass[10pt]{article}

\makeatletter
\newcommand{\printTrueOrFalseC}[1]{%
   \romannumeral
   \if\pdfstrcmp{#1}{true}0%
        \expandafter\@firstoftwo
   \else\expandafter\@secondoftwo
   \fi
   {\z@ true}{\z@ false}%
}

\makeatother
\begin{document}

\huge
\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{true}}}}}}

\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{\printTrueOrFalseC{True}}}}}}% test checks for "true", not "True"
\end{document}

在此处输入图片描述

相关内容