Remover automaticamente a régua quando nenhum cabeçalho estiver presente

Remover automaticamente a régua quando nenhum cabeçalho estiver presente

Esta é uma questão desencadeadaRemover automaticamente o número da página em documentos de uma página.

Ao ativar ofantasiahdrpacote, é necessário limpar os cabeçalhos, o que faço abaixo com \fancyhf{}, pois caso contrário ele será impresso MY FIRST SECTIONcomo cabeçalho do documento abaixo. No entanto, ele ainda imprimirá a régua abaixo do cabeçalho vazio, então removo isso com \renewcommand{\headrulewidth}{0pt}.

O problema é o seguinte: coloquei essas linhas no meu .styarquivo customizado. Quando eufazerquero um cabeçalho no meu documento, claramente não quero conectar esse cabeçalho ao meu .styarquivo. Deveria antes ir no preâmbulo do documento que estou escrevendo, conforme feito abaixo. Mas desde que coloquei \renewcommand{\headrulewidth}{0pt}meu .styarquivo, ele não imprimirá nenhuma régua, mesmo que eu tenha adicionado um cabeçalho.

O que estou procurando é uma maneira de o LaTeX ser ativado automaticamente \renewcommand{\headrulewidth}{0pt}apenas quando o cabeçalho estiver realmente vazio.

\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}

insira a descrição da imagem aqui

Responder1

O exemplo a seguir coloca os elementos do cabeçalho (esquerda, centralizado, direita) em uma caixa e mede sua largura. Se a largura for zero, a regra do cabeçalho será suprimida:

\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}

Observações:

  • A redefinição de \headruleé local para o cabeçalho atual, porque o LaTeX chama o código do cabeçalho dentro de uma caixa/grupo.

Responder2

Algo assim, talvez:

\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}

O código funciona comparando o valor dos componentes do cabeçalho ( \f@ncyoch\f@ncyech\f@ncyorh\f@ncyerh\f@ncyolh\f@ncyelh) com o valor do cabeçalho se ele não tiver conteúdo substantivo ( \unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x). Se forem iguais, define a largura da regra como 0pt. Se forem diferentes, isso não interfere.

O código faz duas suposições importantes. Um deles é provavelmente razoável na maioria dos casos. O outro provavelmente não é.

  • O código pressupõe que você não tenha um cabeçalho vazio nas páginas pares, digamos, e um cabeçalho com conteúdo nas páginas ímpares. Presumo que esta seja uma suposição razoável na maioria dos casos.
  • O código ativa ou desativa a regra de cabeçalho para todo o documento (ou até você emitir um comando para alterar a configuração) com base no fato de o cabeçalho estar vazio ou não no início do documento. Então não vai funcionar se a sua configuração for assim no exemplo do Heiko Oberdiek onde a regra não deveria estar ativa na primeira página, por exemplo, mas deveria estar na próxima. Presumir que o cabeçalho terá conteúdo para todo o documento ou não terá conteúdo para todo o documento provavelmente não é razoável na maioria dos casos.

Cabeçalho com regra

Comentando a linha do cabeçalho:

Sem cabeçalho - sem regra

informação relacionada