everyhook 和 fancyhdr 之间的奇怪互动

everyhook 和 fancyhdr 之间的奇怪互动

在我正在处理的文档中,我希望在自定义环境之前添加空格,但前提是该环境不紧跟在分段命令(\section\subsection等)之后。我想我可以通过 everyhook 包设置段落计数器,并使用 etoolbox 包的\pretocmd宏进行修补\@startsection以重置段落计数器。这似乎工作正常,但我注意到产生的间距中存在一些奇怪的行为……经过一些调试,我将其归结为 everyhook 和 fancyhdr 之间的奇怪交互。这是一个演示正在发生的事情的最小示例:

\documentclass[12pt]{article}
\usepackage{blindtext}
\usepackage{everyhook}
\usepackage{fancyhdr}

\newcounter{paranum}
\PushPreHook{par}{\stepcounter{paranum}}

\pagestyle{fancy}

\begin{document}
  \section*{Heading}

  \theparanum: \blindtext

  \theparanum: \blindtext

  \theparanum: \blindtext

  \section*{Heading}

  \theparanum: \blindtext

  \theparanum: \blindtext

  \theparanum: \blindtext
\end{document}

这会产生

此图片(点击此处)

第一页的计数一切正常,但第二页的计数从 5 跳到 12。删除该\pagestyle{fancy}命令可以解决此问题。为什么?更重要的是,我如何才能继续使用 fancyhdr 包,同时还能准确地对段落进行编号?

答案1

称呼

\usepackage[excludeor]{everyhook}

这将抑制\everypar对输出例程内的标记的评估。

无需 : 也可以获得相同的行为,fancyhdr只需说

\pagestyle{myheadings}

\section*{Heading}
\markright{\protect\parbox{3cm}{abc}}

内置的段落\parbox将导致钩子被执行,计数器被踩踏。使用excludeor此选项不会发生这种情况。

答案2

正如你“就像在自定义环境之前添加空格,但前提是该环境不紧跟在分段命令之后”@nobreak,我建议在环境开始时简单地添加一个开关测试。@nobreak仅在标题之后立即成立。

\documentclass{article}

\newcommand*{\sometext}{Lorem ipsum dolor sit amet, consectetuer
    adipiscing elit. Etiam lobortis facilisis sem. Nullam nec mi et
    neque pharetra sollicitudin. Praesent imperdiet mi nec ante. Donec
    ullamcorper, felis non sodales commodo, lectus velit ultrices augue,
    a dignissim nibh lectus placerat pede.}

\makeatletter
\newenvironment{testenv}{%
  \itshape
  \if@nobreak
  \else
    \vspace{50pt}%
  \fi
}{%
}
\makeatother

\usepackage{blindtext}

\begin{document}

\section*{Heading}

\sometext

\begin{testenv}
\sometext
\end{testenv}

\section*{Heading}

\begin{testenv}
\sometext
\end{testenv}

\end{document}

在此处输入图片描述

相关内容