我已经读完了知道它位于某个部分末尾的宏?我正在尝试检测尚未充实的页面顶部部分。
另一方面,我同意使用标准页眉/标记而不改变页面布局,因此解决方案可能更简单。
平均能量损失
\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}
但请注意,此解决方案
- 脆弱,所以你必须检查你的输出,因为你的文档内容可能很棘手(这里的主要问题是 latex 内部使用你不能直接访问的惩罚(据我所知)因此输出与输入有点异步)
- 如果最后一页没有分段符,而最顶部有一个部分,则解决方案将失败(替换
\lipsum[16-17]
为\lipsum[16]
以检查这是什么意思)。要解决这个问题,你可以采用一种比较粗暴的方式,\par\hbox
在 之前添加一个\end{document}
。