LaTex で、 をXX 回fancyhdr
定義せずに、を使用してセクション ヘッダーごとに異なる画像を追加する方法があるかどうか知りたいです。\fancypagestyle
セクションとそれに対応する画像に同じ名前を付けるのが良い出発点になると思いますが、その後、\fancypagestyle
変数/プレースホルダーを使用してどのように定義するのでしょうか? (申し訳ありませんが、まだ動作するコードがありません)。
どうもありがとう!
答え1
\section
のような関連画像のファイル名を渡すための、 の追加のオプション引数があるとします\section(<image file>)[<toc name>]{<full name>}
。この追加情報が というマクロに格納されると仮定すると、\headerpic
次のようにヘッダーを 1 回だけ宣言できます。
\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}}
。