Agrega una imagen diferente para cada sección con fancyhdr

Agrega una imagen diferente para cada sección con fancyhdr

Me pregunto si hay alguna forma en LaTex de agregar una imagen diferente a cada encabezado de sección usando fancyhdr, pero sin definir \fancypagestyleXX veces.

Creo que un buen punto de partida podría ser darle el mismo nombre a una Sección y su imagen correspondiente, pero luego, ¿cómo definir \fancypagestyleusando una variable/marcador de posición? (Lo siento, todavía no tengo un código funcional).

¡Muchas gracias!

Respuesta1

Suponga que tiene un argumento opcional adicional para \sectionpasar el nombre de archivo de una imagen asociada como \section(<image file>)[<toc name>]{<full name>}. Suponiendo que esta información adicional se almacena en una macro llamada, \headerpices posible simplemente declarar el encabezado una vez así:

\fancyhead[C]{\includegraphics[width=\textwidth]{\headerpic}}

Una posible implementación se vería así.

\let\ltx@section\section
\def\section{\kernel@ifnextchar(%
  {\@section@HP}%
  {\@section@HP(\@headerpic@default)}%
}
\def\@section@HP(#1){%
  \clearpage\xdef\headerpic{#1}\ltx@section
}

No pasar ninguna imagen resultará en volver a \@headerpic@default, que debe configurarse manualmente o mediante un contenedor para que se vea bien:

\def\SetHeaderpicDefault#1{%
  \xdef\headerpic{#1}
  \xdef\@headerpic@default{#1}
}

Esto también inicializa, \headerpiclo cual es crucial si el primer encabezado está escrito sin que haya una sección presente.

salida0

salida1

Código completo

% arara: pdflatex: { shell: true }
\documentclass[11pt]{article}
% This is just to make sure that the the demo pictures used are present
\write18{wget https://i.picsum.photos/id/388/2000/200.jpg}
\write18{wget https://i.picsum.photos/id/495/2000/200.jpg}
\write18{wget https://i.picsum.photos/id/520/2000/200.jpg}
\usepackage{graphicx}
\usepackage{fancyhdr}
  \pagestyle{fancy}
  \fancyhf{}
  \fancyhead[C]{\includegraphics[width=\textwidth]{\headerpic}}

\usepackage{lipsum}

\makeatletter
\let\ltx@section\section
\def\section{\kernel@ifnextchar(%
  {\@section@HP}%
  {\@section@HP(\@headerpic@default)}%
}
\def\@section@HP(#1){%
  \clearpage\xdef\headerpic{#1}\ltx@section
}
\def\SetHeaderpicDefault#1{%
  \xdef\headerpic{#1}
  \xdef\@headerpic@default{#1}
}
\makeatother

\renewcommand*\headrulewidth{0pt}
\setlength\headheight{40pt}
\SetHeaderpicDefault{388-2000x200.jpg}

\begin{document}
\section{Lorem Ipsum}
\lipsum
\section(495-2000x200.jpg){Lorem Ipsum}
\lipsum
\section(520-2000x200.jpg){Dolor Sit}
\lipsum
\section{Dolor Sit}
\lipsum
\end{document}

Sin embargo, una advertencia importante es que la \@section@HPmacro impone una nueva página para asegurarse de que la imagen correcta esté asociada con la sección correspondiente.

Si desea evitar el azúcar sintáctico de la solución anterior, por supuesto, se podría optar por algo como

\section[<toc name>]{<full name>}
\SetHeaderpic{<file name>}

con \def\SetHeaderpic#1{\xdef\headerpic{#1}}.

información relacionada