\@subheader
以下命令周围的感叹号(!)起什么作用?
\renewcommand\maketitle{
...
\if!\@subheader!\else\noindent{\trfont{\@subheader}}\fi
...
}
有人能解释一下这是怎么回事吗?我认为它应该做的是
- 如果
\@subheader
为空,则不执行任何操作。 - 否则使用指定的字体来排版子标题。
但我不明白!...的意思!
仅就上下文而言,\@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>
其余部分仍然存在并产生不必要的额外输出。\@subheader
oohh, nasty
!
如果 TeX中没有尾随,\if!\@subheader!
则必须继续寻找第二个标记,以防\@subheader
扩展为无。