![Eliminar automáticamente la regla cuando no hay encabezado](https://rvso.com/image/286336/Eliminar%20autom%C3%A1ticamente%20la%20regla%20cuando%20no%20hay%20encabezado.png)
Esta es una pregunta provocada porEliminar automáticamente el número de página en documentos de una página.
Al activar elfantasíahdrpaquete, es necesario borrar los encabezados, lo cual hago a continuación con \fancyhf{}
, porque de lo contrario se imprimirá MY FIRST SECTION
como el encabezado del documento a continuación. Sin embargo, seguirá imprimiendo la regla debajo del encabezado vacío, así que la elimino con \renewcommand{\headrulewidth}{0pt}
.
El problema es este: puse estas líneas en mi .sty
archivo personalizado. Cuando yohacerSi quiero un encabezado en mi documento, claramente no quiero incluir ese encabezado en mi .sty
archivo. Más bien debería ir en el preámbulo del documento que estoy escribiendo, como se hace a continuación. Pero desde que ingresé \renewcommand{\headrulewidth}{0pt}
mi .sty
archivo, ahora no imprimirá ninguna regla, aunque agregué un encabezado.
Lo que estoy buscando es una forma de que LaTeX se active automáticamente \renewcommand{\headrulewidth}{0pt}
sólo cuando el encabezado esté realmente vacío.
\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}
Respuesta1
El siguiente ejemplo coloca los elementos del encabezado (izquierda, centrado, derecha) en un cuadro y mide su ancho. Si el ancho es cero, entonces se suprime la regla del encabezado:
\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}
Observaciones:
- La redefinición de
\headrule
es local para el encabezado actual, porque LaTeX llama al código del encabezado dentro de un cuadro/grupo.
Respuesta2
Algo como esto, tal vez:
\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}
El código funciona comparando el valor de los componentes del encabezado ( \f@ncyoch\f@ncyech\f@ncyorh\f@ncyerh\f@ncyolh\f@ncyelh
) con el valor del encabezado si no tiene contenido sustancial ( \unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x
). Si son iguales, establece el ancho de la regla en 0pt
. Si son diferentes, no interfiere.
El código hace 2 suposiciones importantes. Probablemente uno sea razonable en la mayoría de los casos. El otro probablemente no lo sea.
- El código supone que no tiene un encabezado vacío en las páginas pares, por ejemplo, y uno con contenido en las impares. Supongo que esta es una suposición razonable en la mayoría de los casos.
- El código habilita o deshabilita la regla del encabezado para todo el documento (o hasta que emita un comando para cambiar la configuración) en función de si el encabezado está vacío o no al comienzo del documento. Por lo tanto, no funcionará si su configuración es como la del ejemplo de Heiko Oberdiek, donde la regla no debería estar activa en la primera página, por ejemplo, pero sí en la siguiente. Suponer que el encabezado tendrá contenido para todo el documento o no lo tendrá para todo el documento probablemente no sea razonable en la mayoría de los casos.
Comentando la línea del encabezado: