Мне интересно, есть ли в LaTex способ добавить разные картинки в каждый заголовок раздела, используя fancyhdr
, но без указания \fancypagestyle
XX раз.
Думаю, хорошей отправной точкой было бы дать разделу и соответствующей ему картинке одно и то же имя, но как тогда определить \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
, что имеет решающее значение, если первый заголовок набран без раздела.
Полный код
% 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}}
.