检测页面顶部的部分

检测页面顶部的部分

我已经读完了知道它位于某个部分末尾的宏?我正在尝试检测尚未充实的页面顶部部分。

另一方面,我同意使用标准页眉/标记而不改变页面布局,因此解决方案可能更简单。

平均能量损失

\documentclass{article}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead{}
\fancyhead[L]{\topmark}
\usepackage{lipsum}

\begin{document}
\section{One}
\lipsum[1-6]
\section{Two}
\lipsum[7-9]
\section{Three}
\lipsum[10]
\end{document}

\topmark工作正常,但第 3 页上的前一节提醒是多余的。在\fancyhead或类似内容中,我如何检测到页面以新部分开始并更改行为?

例如,假设我想清空第 3 页的页眉(或打印其他内容),因为第 2 页没有后续的实际内容。

\pagetotal当前方向是在分段命令开始时进行测试,但是

\usepackage{etoolbox}
\pretocmd{\section}{\message{\the\pagetotal}}{}

显示此时尚未传送上一页,如果是实际内容导致分页,则不是硬性的\pagebreak

答案1

我不太确定我是否理解了期望的结果。如果你想在不以新部分开头的页面上保留之前发布的标题,你可以使用

\documentclass{article}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead{}
\fancyhead[L]{\topmark}
\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage{everyshi}

\pretocmd{\section}{%
  \ifdim\pagetotal=0pt%
    \ifnum\value{section}>0%
      \let\akttopmark\topmark
      \AtNextShipout{\let\topmark\akttopmark}%
    \fi%
  \fi%
  }{}

\begin{document}
\section{One}
\lipsum[1-6]
\section{Two}
\clearpage
\section{Three}
\end{document}

但是,如果您希望第 3 页的页眉为空(以避免此页面顶部重复信息),只需使用

\documentclass{article}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead{}
\fancyhead[L]{\topmark}
\usepackage{lipsum}
\usepackage{etoolbox}

\fancypagestyle{plain}{%
  \fancyhf{}% clear all header and footer fields
  \renewcommand{\headrulewidth}{0.4pt}%
}
\pretocmd{\section}{%
  \ifdim\pagetotal=0pt%
    \ifnum\value{section}>0%
      \thispagestyle{plain}
    \fi%
  \fi%
  }{}

\begin{document}
\section{One}
\lipsum[1-6]
\section{Two}
\clearpage
\section{Three}
\end{document}

这将清理此页面的页眉。

但是 - 基本测试是以 \pretocmd{\section}% 开头的部分,它测试是否在页面顶部调用 section 命令。

编辑:

显然,原作者在他的评论中说得对,这对 article 类不起作用(但基本上对 scrbook 起作用)。因此,使用tracingpages这里tracingmacros是一个适用于标准 article 类的改编解决方案,至少对我来说是这样:

\documentclass{article}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead{}
\fancyhead[L]{\topmark}
\usepackage{lipsum}
\usepackage{afterpage}
\usepackage{xpatch}

\fancypagestyle{plain}{%
  \fancyhf{}% clear all header and footer fields
  \renewcommand{\headrulewidth}{0.4pt}%
}

\newdimen\pagetopsectres

\makeatletter
\AtBeginDocument{%
  \pagetopsectres=\textheight
  \advance\pagetopsectres by 1\baselineskip

\apptocmd{\@xsect}{%\showthe\textheight\showthe\pagetotal\showthe\baselineskip%
  \ifdim\pagetotal>\textheight%
    \ifdim\pagetotal<\pagetopsectres%
      \typeout{manipulating page header of next page}%
      \afterpage{\thispagestyle{plain}}%
    \fi%
  \fi%
  }{}{}}%
\makeatother

\begin{document}
\section{One}
\lipsum[1-6]
\section{Two}
\lipsum[7-10]
\section{Three}
\lipsum[11-15]
\section{Four}
\lipsum[16-17]

%\par\hbox{}
\end{document}

但请注意,此解决方案

  1. 脆弱,所以你必须检查你的输出,因为你的文档内容可能很棘手(这里的主要问题是 latex 内部使用你不能直接访问的惩罚(据我所知)因此输出与输入有点异步)
  2. 如果最后一页没有分段符,而最顶部有一个部分,则解决方案将失败(替换\lipsum[16-17]\lipsum[16]以检查这是什么意思)。要解决这个问题,你可以采用一种比较粗暴的方式,\par\hbox在 之前添加一个\end{document}

相关内容