我尝试使用嵌套的 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}