Добавьте разные изображения для каждого раздела с помощью fancyhdr

Добавьте разные изображения для каждого раздела с помощью fancyhdr

Мне интересно, есть ли в LaTex способ добавить разные картинки в каждый заголовок раздела, используя fancyhdr, но без указания \fancypagestyleXX раз.

Думаю, хорошей отправной точкой было бы дать разделу и соответствующей ему картинке одно и то же имя, но как тогда определить \fancypagestyleс помощью переменной/заполнителя? (Извините, у меня все еще нет работающего фрагмента кода).

Большое спасибо!

решение1

Предположим, у вас есть дополнительный необязательный аргумент для \sectionпередачи имени файла для связанной картинки, например \section(<image file>)[<toc name>]{<full name>}. Предполагая, что эта дополнительная информация хранится в макросе с именем , \headerpicможно просто объявить заголовок один раз следующим образом:

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

Возможная реализация будет выглядеть следующим образом.

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

Если не передать изображение, то будет выполнен возврат к значению \@headerpic@default, которое следует задать вручную или с помощью оболочки, чтобы оно выглядело красиво:

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

Это также инициализирует \headerpic, что имеет решающее значение, если первый заголовок набран без раздела.

вывод0

выход1

Полный код

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

Однако есть одно важное предостережение: макрос \@section@HPпринудительно создает новую страницу, чтобы убедиться, что нужная картинка связана с соответствующим разделом.

Если вы хотите избежать синтаксического сахара вышеприведенного соултиона, можно, конечно, использовать что-то вроде

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

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

Связанный контент