这个问题是由自动删除单页文档中的页码。
激活花式高清包,需要清除标题,下面我用 来清除\fancyhf{}
,因为否则它会打印MY FIRST SECTION
为下面文档的标题。但是,它仍然会在空标题下方打印标尺,因此我用 将其删除\renewcommand{\headrulewidth}{0pt}
。
问题是这样的:我把这些行放在我的自定义.sty
文件中。当我做我想要文档中的页眉,我显然不想将该页眉硬编码到我的.sty
文件中。它应该放在我正在编写的文档的序言中,如下所示。但是由于我将其放入文件\renewcommand{\headrulewidth}{0pt}
中.sty
,因此即使我添加了页眉,它现在也不会打印任何标尺。
我正在寻找一种方法,使 LaTeX\renewcommand{\headrulewidth}{0pt}
仅在标题实际上为空时自动激活。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{mystyle.sty}
%% My package starts here
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
\endinput
%% And ends here
\end{filecontents}
\usepackage{mystyle}
\fancyhead[C]{Woah! There's no ruler here!}
\begin{document}
\section{My first section}
\end{document}
答案1
以下示例将标题元素(左、中、右)放在一个框中并测量其宽度。如果宽度为零,则抑制标题规则:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{mystyle.sty}
%% My package starts here
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}
\RequirePackage{fancyhdr}
\let\org@fancyhead\@fancyhead
\renewcommand*{\@fancyhead}[5]{%
\sbox0{#2#3#4}%
\ifdim\wd0=\z@
\let\headrule\relax
\fi
\org@fancyhead{#1}{#2}{#3}{#4}{#5}%
}
\pagestyle{fancy}
\fancyhf{}
\endinput
%% And ends here
\end{filecontents}
\usepackage{mystyle}
\begin{document}
\section{My first section}
\newpage
\fancyhead[C]{Header is set}
\section{My next section}
\end{document}
评论:
- 的重新定义
\headrule
对于当前标题来说是本地的,因为 LaTeX 在框/组内部调用标题代码。
答案2
也许是这样的:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{mystyle.sty}
%% My package starts here
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\makeatletter
\AtBeginDocument{% don't make the comparison until the start of the document as the header may get specified later in the preamble
\xdef\tempa{\f@ncyoch\f@ncyech\f@ncyorh\f@ncyerh\f@ncyolh\f@ncyelh}% get the value of the header parts
\xdef\tempb{\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x}% value for comparison: contents of header parts if no content is specified
\ifx\tempa\tempb% test to see if they are the same
\renewcommand{\headrulewidth}{0pt}% if they are, the centre header is empty to set the rule width to 0pt
\fi% otherwise, do nothing
}
\makeatother
\endinput
%% And ends here
\end{filecontents}
\usepackage{mystyle}
\fancyhead[C]{Woah! There's no ruler here!}
% \fancyhead[C]{}
\begin{document}
\section{My first section}
\end{document}
代码的工作原理是将标题组件的值 ( \f@ncyoch\f@ncyech\f@ncyorh\f@ncyerh\f@ncyolh\f@ncyelh
) 与标题的值(如果标题没有实质性内容)进行比较\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x
。如果它们相同,则将规则宽度设置为0pt
。如果它们不同,则不会干扰。
代码做出了 2 个重要假设。一个假设在大多数情况下可能是合理的。另一个假设可能不合理。
- 代码假设您在偶数页上没有空标题,而在奇数页上没有内容标题。我认为这在大多数情况下都是合理的假设。
- 代码会根据文档开头的页眉是否为空来启用或禁用整个文档的页眉规则(或直到您发出更改设置的命令)。因此,如果您的配置与 Heiko Oberdiek 的示例类似,则它将不起作用,例如,规则在第一页上不应处于活动状态,而应在下一页处于活动状态。在大多数情况下,假设页眉将包含整个文档的内容或不包含整个文档的内容可能并不合理。
注释掉标题行: