变量周围有感叹号

变量周围有感叹号

\@subheader以下命令周围的感叹号(!)起什么作用?

\renewcommand\maketitle{
...
\if!\@subheader!\else\noindent{\trfont{\@subheader}}\fi
...
}

有人能解释一下这是怎么回事吗?我认为它应该做的是

  1. 如果\@subheader为空,则不执行任何操作。
  2. 否则使用指定的字体来排版子标题。

但我不明白!...的意思!

仅就上下文而言,\@subheader先前定义为

\def\@subheader{\@empty}
\newcommand{\subheader}[1]{\gdef\@subheader{#1}}

我查阅了有关 TeX 和 LaTeX 的两本参考书,但找不到任何解释。

答案1

LaTeX \if 条件有很好的解释\if和链接TeX 按主题分类我们已经对此进行了更深入的解释,因此我们可以集中讨论这里的这个特定例子。

考试

\if!\@subheader!\else\noindent{\trfont{\@subheader}}\fi

确实是为了检查是否\@subheader为空。它依赖于这样的假设:的内容\@subheader永远不会以 开头!

\documentclass{article}

\newcommand*{\mytest}{%
  \if!\foo!
    empty
  \else
    \emph{not} empty
  \fi    
}


\begin{document}
\def\foo{\empty}
\mytest

\def\foo{}
\mytest

\def\foo{Hello}
\mytest

\def\foo{!oohh, nasty}
\mytest

\def\foo{That works! Phew!}
\mytest

\def\foo{ }
\mytest
\end{document}

空//空//不空//哦,令人讨厌的空//不空//不空

显示了一些条件实际作用的例子。

\if扩展以下内容,直到找到两个不可扩展的标记。然后比较这些标记。

已经!是一个不可扩展的标记,因此测试将与扩展!时出现的第一个不可扩展的标记进行比较。\@subheader!

假设\@subheader是空的,也就是说,如果完全展开,它会扩展为零。例如,如果我们有\def\@subheader{}\def\@subheader{\@empty},其中\@subheader被定义为扩展为\@empty,而 又会扩展为零。然后与\if!\@subheader!进行比较,因为会扩展为零并消失。该测试为真,因此我们得到了分支,它在原始代码中不执行任何操作。!!\@subheader<true>

假设\@subheader不为空,且其完全扩展后的第一个标记不为!。例如,如果\@subheader\def\@subheader{Hello},则与\if!\@subheader!进行比较,其余扩展和尾随( ) 继续存在于分支中。由于和不同,我们得到了分支,但看不到多余的字母。!H!ello!<true>!H<false>

假设\@subheader扩展为包含!第一个标记的内容,例如\def\@subheader{!oohh, nasty}然后\if!\@subheader!比较!!进入分支。扩展的( )<true>其余部分仍然存在并产生不必要的额外输出。\@subheaderoohh, nasty


!如果 TeX中没有尾随,\if!\@subheader!则必须继续寻找第二个标记,以防\@subheader扩展为无。

相关内容