我觉得自己问这个问题很愚蠢,但是如何在 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
只是测试0
或1
。 (这是因为 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
和pgfmath
(TikZ
):
\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}