如何在 TeX 中形成“如果...或...那么”条件?

如何在 TeX 中形成“如果...或...那么”条件?

我觉得自己问这个问题很愚蠢,但是如何在 TeX 中形成更复杂的 if 条件?我正在寻找类似的东西:

\ifnum\x=1 OR \ifnum\x=14
    {do this}
\else
    {do that}
\fi

当主体相同时,我不想为了改变表情而不得不复制粘贴整个条件。

答案1

有很多方法。假设你正在寻找一个纯粹基于原始的,那么

\ifnum\ifnum\x=1 1\else\ifnum\x=14 1\else0\fi\fi
   =1 %
   <do this>
 \else
   <do that>
 \fi

因此,您可以使用“次要”条件将原始问题转换为简单的 TRUE/FALSE 情况,其中“外部”\ifnum只是测试01。 (这是因为 TeX 在考虑外部 时会不断扩展直到找到一个数字\ifnum。)

使用此方法时,正确使用数字结尾非常重要。在示例中,\x=1和后面的空格\x=14是获得正确结果所必需的。只要发挥一点想象力,您就可以使用相同的方法构造更复杂的结构(例如,您可以以这种方式组合 OR 和 AND 条件。)

如果逻辑变得复杂,另一种方法是将“有效负载”作为单独的宏包含:

\ifnum\x=1 %
  \expandafter\myfirstcase
\else
  \ifnum\x=14 %
    \expandafter\expandafter\expandafter\myfirstcase
  \else
    \expandafter\expandafter\expandafter\mysecondcase
  \fi
\fi
\def\myfirstcase{do this}
\def\mysecondcase{do that}

这是您在较大的“待办事项”块中经常看到的情况。\expandafter使用这种方法是“良好做法”,但可能不需要,具体取决于要插入的代码的确切性质。

答案2

\usepackage{etoolbox}

\newcommand{\mytest}[1]{%
  \ifboolexpr{ test {\ifnumcomp{#1}{=}{1}} or test {\ifnumcomp{#1}{=}{14}} }
    {do this}
    {do that}}

\mytest{1} \mytest{14} \mytest{0}

还有西弗森提供“复合”测试的包。

答案3

包裹xintexpr在算术表达式上实现布尔逻辑。我们可以在其中使用该\pdfstrcmp实用程序(如果引擎允许)来比较字符串。

\documentclass{article}

\usepackage{xintexpr}

\begin{document}

\def\x{14}

\xintifboolexpr { \x = 1 || \x = 14 }
  {True}
  {False}

\xintifboolexpr { even(\x) && \x < 24 }
  {True}
  {False}

\xintifboolexpr { \x = floor(sqrt(\x))^2 }
  {True}
  {False}

% \pdfstrcmp {text1}{text2} evaluates to 0 if text1 and text2 are equal
% to -1 if text1 comes first in lexicographic order, to +1 else
% To test if the strings are equal we thus use not(\pdfstrcmp {text1}{text2})
% (or we can use the ! as synonym of the "not" function)

\xintifboolexpr { 1=1 && (2=3 || 4<= 4 || not(\pdfstrcmp {abc}{def})) && !(2=4)}
  {True}
  {False}

\xintifboolexpr {\pdfstrcmp {abc}{def} = -1}
  {True}
  {False}

\end{document}

使用 PDFLaTeX 编译:

在此处输入图片描述

该包还可以与 Plain TeX 一起使用。

如上所示,&&是 AND,||是 OR。也可以'and'分别写成 and 'or'(必须加引号)。

答案4

pgfmathTikZ):

在此处输入图片描述

\documentclass{article}
\usepackage{pgfmath}
\begin{document}
\newcommand\OrTest[1]{%
\pgfmathparse{#1==14 || #1==1 ? "#1 is equal to 1 or 14." :  "#1 is not equal to 1 or 14."}%
\pgfmathresult}

\OrTest{14}

\OrTest{123}
\end{document}

如果您想要的不仅仅是文本输出,您可以将其用作真/假测试器,如下所示:

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\begin{document}
\foreach \No in {-3,0,1,2,3,7,11,14,123,1,7,999}{%%
\pgfmathparse{\No==1 || \No==14 ? 1 :  0}
\ifnum\pgfmathresult=1 \colorbox{blue!33}{\No}~%
 \else%
 \colorbox{red!33}{\No}~%
\fi}%%
\end{document}

相关内容