![Автоматически удалять линейку при отсутствии заголовка](https://rvso.com/image/286336/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D1%83%D0%B4%D0%B0%D0%BB%D1%8F%D1%82%D1%8C%20%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BA%D1%83%20%D0%BF%D1%80%D0%B8%20%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D0%B8%D0%B8%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B0.png)
Этот вопрос возник из-заАвтоматически удалять номера страниц в одностраничных документах.
При активацииfancyhdrпакет, необходимо очистить заголовки, что я делаю ниже с помощью \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 важных предположения. Одно из них, вероятно, разумно в большинстве случаев. Другое, вероятно, нет.
- Код предполагает, что у вас нет пустого заголовка на четных страницах, скажем, и содержательного на нечетных. Я полагаю, что это разумное предположение в большинстве случаев.
- Код либо включает, либо отключает правило заголовка для всего документа (или пока вы не дадите команду изменить настройку) в зависимости от того, пуст заголовок или нет в начале документа. Поэтому он не будет работать, если ваша конфигурация похожа на ту, что в примере Хайко Обердика, где правило не должно быть активным на первой странице, например, но должно быть на следующей. Предположение, что заголовок либо будет иметь содержимое для всего документа, либо не будет иметь его для всего документа, вероятно, неразумно в большинстве случаев.
Комментируем строку заголовка: