设置 \pagestyle{fancy} 似乎会产生错误

设置 \pagestyle{fancy} 似乎会产生错误

调用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

相关内容