\iffalse 是做什么的?

\iffalse 是做什么的?

所以这是我一段时间以来一直想知道的事情。一个总是计算结果为假的条件有什么用呢?我猜这是一种“隐藏 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 中也有truefalse命令,因为有时您必须以特定方式指示成功或失败。在这种情况下,操作系统希望程序以特定的“返回值”退出,这些程序只提供该值。因此,如果您想进行某种复杂的测试,然后使用此机制分支结果,您可以使用其中一个命令向该机制发出信号,表明您认为测试已结束。

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 中,但让用户(即源代码的读者)可以看到它。

相关内容