我想知道在 LaTex 中是否有一种方法可以使用 向每个 Section 标题添加不同的图片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}}
。