Adicione uma imagem diferente para cada seção com o fancyhdr

Adicione uma imagem diferente para cada seção com o fancyhdr

Estou me perguntando se existe uma maneira no LaTex de adicionar uma imagem diferente a cada cabeçalho de seção usando fancyhdr, mas sem definir \fancypagestyleXX vezes.

Acho que um bom ponto de partida poderia ser dar o mesmo nome a uma Seção e à imagem correspondente, mas então - como definir \fancypagestyleusando uma variável/espaço reservado? (Desculpe, ainda não tenho um código funcional).

Muito obrigado!

Responder1

Suponha que você tenha um argumento opcional adicional para \sectionpassar o nome do arquivo para uma imagem associada como \section(<image file>)[<toc name>]{<full name>}. Supondo que essas informações adicionais sejam armazenadas em uma macro chamada, \headerpicé possível simplesmente declarar o cabeçalho uma vez, assim:

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

Uma possível implementação seria assim.

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

Não passar nenhuma imagem resultará na reversão para \@headerpic@default, que deve ser definido manualmente ou por meio de um wrapper para torná-lo bonito:

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

Isso também inicializa, \headerpico que é crucial se o primeiro cabeçalho for composto sem a presença de uma seção.

saída0

saída1

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}

Uma ressalva importante, entretanto, é que a \@section@HPmacro impõe uma nova página para garantir que a imagem correta esteja associada à seção correspondente.

Se você quiser evitar o açúcar sintático da alma acima, é claro que você poderia escolher algo como

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

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

informação relacionada