所以这是我一段时间以来一直想知道的事情。一个总是计算结果为假的条件有什么用呢?我猜这是一种“隐藏 LaTeX 代码”的巧妙方法,但除此之外,它还有用吗?
答案1
Knuth 对此的回答很有启发性:在 TeXbook 第 211 页,他描述了该\phantom
命令的演变。起初,他使用宏\yes
和\no
来决定是否请求垂直或水平尺寸:
\def\yes{\if00}
\def\no{\if01}
\iftrue
显然,这些在原则上与和具有相同的效果。然而,他随后发现,他在自己的编程语言中\iffalse
定义的方式使这种方法不可行:\if...
\if...(\yes...\fi)...\else...\fi
我插入了括号来表明意图。如果\if...
返回“false”,则跳过整个第一个分支并没有扩大;唉,TeX 不知道我用这些括号表示什么,所以它\if
用第一的 \fi
,因为就它而言\yes
不是一个“ ”,并且它不会使用它来匹配嵌套。\if
因此,\iftrue
和\iffalse
是支持抽象决策的语法钩子。通过它们,整个\newif
机制(即\newif\ifsomethingstrange
,当您决定发生了一些奇怪的事情时,接着是\somethingstrangetrue
)是可能的。事实上,\somethingstrangetrue
只是定义\ifsomethingstrange
为\iftrue
;它使用\let
,所以 TeX做将此“ \if
”视为合法条件。
编程中的同义反复传统有着悠久的历史:Unix 中也有true
和false
命令,因为有时您必须以特定方式指示成功或失败。在这种情况下,操作系统希望程序以特定的“返回值”退出,这些程序只提供该值。因此,如果您想进行某种复杂的测试,然后使用此机制分支结果,您可以使用其中一个命令向该机制发出信号,表明您认为测试已结束。
(man
这些命令的页面很有趣:true
“成功,什么也不做”,但很可怜false
“不成功,什么也不做”。)
答案2
TeX 接受以下定义:
\def\obrace{\iftrue{\else}\fi}
\def\cbrace{\iffalse{\else}\fi}
并且,在扩展上下文中,它们可用于使 TeX 看到打开和关闭参数分隔符;我已经用过这个想法\contfrac{1;2,3,4}
使用扩展为的语法来构建连续分数
1+\cfrac{1}{2+\cfrac{1}{3+\cfrac{1}{4}}}
无需用户确保支架匹配。
不过,它的主要用途是定义新的条件句。当有人说
\let\xyz\ify
(其中\ify
是任何原始条件),控制序列\xyz
被标记为条件,因此它参与嵌套条件匹配。命令如
\newif\ifxyz
实际上定义了两个命令\xyztrue
和\xyzfalse
,并执行后者。这两个命令定义为
\def\xyztrue{\let\ifxyz\iftrue}
\def\xyzfalse{\let\ifxyz\iffalse}
所以这始终是或\ifxyz
之一,并且因此可以嵌套在其他条件构造中。\iftrue
\iffalse
其他编程风格不使用它们;例如 LaTeX3 中的条件语句的形式为
\prefix_if_something:nTF {<condition>} {<true>} {<false>}
因此没有明确的条件嵌套(但有参数嵌套)。
请注意,还将两个控制序列和标记\let\myelse\else
为嵌套条件匹配的一部分;实际上,Plain TeX 和 LaTeX 都说为了能够跳过恰好位于另一个条件的“False”分支中的构造。\let\myfi\fi
\myelse
\myfi
\let\repeat\fi
\loop
答案3
所有\ifXXX
非 TeX 原始命令总是等于\iftrue
或\iffalse
。LaTeX 包含大量此类命令,例如\if@twocolumn
等。
您通常不会使用\iffalse
其本身,但会使用其中一些命令。
当您想将其更改\ifXXX
为真时,您会说\let\ifXXX\iftrue
,这正是它的\XXXtrue
作用。对于假或当然,同样如此。
答案4
我猜你知道,但是……
\iffalse
用于.dtx
文件中的元注释。
% \iffalse meta-comment
%
% Copyright (C) 2012 by Tobias Weh
% www.tobias-weh.de
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{twfonts.dtx}[2012/03/01 v1.0 Private XeTeX package]
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[2009/01/01]
%<class>\ProvidesPackage{twfonts}
%<class> [2012/03/01 v1.0 Private XeTeX package]
%
%<*driver>
\documentclass{ltxdoc}
\begin{document}
\DocInput{twfonts.dtx}
\end{document}
%</driver>
% \fi
%
% Documentation-Text
%
% \section{Implementation}
% A simple macro:
% \begin{macrocode}
\newcommand{\macro}{Hello World!}
% \end{macrocode}
%
\endinput
.dtx
是一个用于文学编程的文件。这两个\iffalse
宏将代码隐藏在 TeX 中,但让用户(即源代码的读者)可以看到它。