我有一个场景,我需要根据序言中的一些条件定义一些命令和环境。我曾经使用,使用或\newtoggle
设置条件并使用包中定义的宏。但是,我现在拥有的条件不受布尔类型的约束。它符合下面的 if-else 结构\toggletrue
\togglefalse
\iftoggle
etoolbox
if <condition 1>
define commands <a1, a2>
define environments <b1, b2>
elseif <condition 2>
define commands <a3, a4>
define environments <b3, b4>
..
else
define commands <p, q>
define environments <x, y>
我尝试使用该algorithmic
包,但显然我无法在序言中使用它。我有什么办法可以在序言中定义多条件 if-else 情况吗?
Update 1
不同情况下的命令和环境名称相同,只是定义不同
Update 2
条件有多种toggles
,我打算用\newtoggle
命令来定义条件变量。
\newtoggle{variable1}
\toggletrue{variable1}
\newtoggle{variable2}
\togglefalse{variable2}
条件的伪代码如下
% The conditions
if variable1 && variable2
% do something
else if variable1 && !variable2
% do something else
else if !variable1 && variable2
% do the thing
else
% do the other thing
我知道可以使用嵌套的 if 条件来完成此操作,但我想知道是否有任何非嵌套的方法可以做到这一点。
答案1
与几乎所有编程语言一样,\if...
语句可以嵌套,但是,没有\elseif
,因此\else \if....
必须使用并以 结尾\fi
。
\if...
可以使用以下方式定义新变量(实际上是宏)
\newif\ifsomename
最初设置为假状态。\somenametrue
将设置为true
,\somenamefalse
将设置为假。
然而,在 TeX 中嵌套\if...\fi
可能非常繁琐。
以下是一些伪代码
\ifsomething...
do this and that
\else
\ifsomethingother
...
\else
\ifsomethingmore
\fi
\fi
\fi
下面的小例子应该用粗体字体打印‘Foo that’,因为\dothattrue
已经指定。
\documentclass{article}
\newif\ifdothis
\newif\ifdothat
\dothattrue % Setting the state of the boolean variable \ifdothat` to true, otherwise it's false already (or use \dothatfalse explicitly)
\ifdothis
\newcommand{\foo}{\textbf{Foo}}
\else
\ifdothat
\newcommand{\foo}{\textbf{Foo that}}
\else
\newcommand{\foo}{\textbf{Dummy content}}
\fi % \fi of \ifdothat
\fi % Outer \fi
\begin{document}
\foo
\end{document}
答案2
可以使用普通的 TeX 条件来处理多个条件\ifnum
,例如
\ifnum0%
\iffirstsomething 1\fi
\ifsecondsomething 1\fi
>0 %
% Do stuff
\fi
只有满足至少一个条件时才会执行该操作。同样
\ifnum0%
\iffirstsomething\else1\fi
\ifsecondsomething\else1\fi
=0 %
% Do stuff
\fi
仅当两个条件都满足时才会为真。