调用fancy
页面样式显然以某种方式导致以下条件测试为真。
\documentclass{article}
\usepackage{fancyhdr}
\pagestyle{fancy}
\ifcsname chapter\endcsname%
\renewcommand{\chapter}{}
\fi
\pagestyle{empty}
\begin{document}
testing
\end{document}
如果我\pagestyle{fancy}
在条件之后放置 ,\ifcsname chapter....\fi
则一切正常。这是一个article
类,因此该条件应为 false。如果我调用\pagestyle{plain}
,则将其放置在哪里并不重要。
这个命令为什么重要?
答案1
页面样式fancy
(\ps@fancy
)包含:
\@ifundefined{chapter}{...}{...}
这是未定义的 LaTeX 测试:
\def\@ifundefined#1{%
\expandafter\ifx\csname#1\endcsname\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\csname
它的副作用是它定义了一个未定义的命令,其含义是\relax
:
\show\chapter
\pagestyle{fancy}% \@ifundefined{chapter}{...}{...}
\show\chapter
变更的含义\chapter
:
> \chapter=undefined.
l.3 \show\chapter
?
> \chapter=\relax.
l.5 \show\chapter
现在\chapter
为 e-TeX 定义了\ifcsname
,并且\renewcommand{\chapter}{}
再次使用了 LaTeX 未定义的想法:如果命令未定义或具有 的含义,则该命令未定义\relax
。结果\renewcommand
抱怨“\chapter 未定义”。
e-TeX\ifcsname
没有副作用,并且不影响命令。(此外,它在内部进行了优化,因为它不会创建哈希表条目。)
测试需要稍微长一点:
\ifcsname chapter\endcsname
\ifx\chapter\relax
\else
\renewcommand\chapter{}
\fi
\fi
定义\chapter
可能会使包和宏对类的功能产生混淆(article
没有章节)。如果神秘的目的\renewcommand\chapter{}
是取消定义chapter,那么它将失败,因为\chapter
仍然定义了一个空宏的含义。可以通过将命令分配给未定义的宏来取消定义命令:
\ifcsname chapter\endcsname
\let\chapter\UnDeFiNeD
\fi