我正在创建三个文档,其中包含三个不同的页眉,包含图像或大型横幅。有没有办法自动确定页眉高度,或者更好的方法是根据内容自动更改页眉高度?
我知道 LaTeX 告诉我头部高度太小,我应该将其更改为 xx pt,但我不想手动执行此操作。
以下是我的一份文件开头的一段摘录:
\documentclass[pdftex,12pt,oneside]{report}
\usepackage[pdftex]{graphicx}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage[paper = a4paper, tmargin = 2cm, bmargin = 2cm, lmargin = 2.5cm, rmargin = 2cm]{geometry}
\usepackage{fancyhdr}
\fancypagestyle{titlepage}
{
\fancyhf{}
\fancyhead[L]{~\\[0.5cm]\includegraphics[height=2cm]{./dhbw_logo}}
\fancyhead[R]{~\\[0.5cm]\includegraphics[width=2cm]{./cz_logo}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
}
答案1
我认为,在整个文档中使用过大的标题页标题高度没有什么意义。不过,这个问题总体上很有趣。
如果页眉或页脚太小,则包fancyhdr
已更新\headheight
或。以下示例将这些维度寄存器的最新值存储在文档末尾的辅助文件中。如果文件存在,则会在加载可能使用更新值进行计算的包之前在序言中读取它。因此,该文件不能用于此目的,因为它读取得有点太晚了(在)。\footskip
\jobname.heights
geometry
.aux
\begin{document}
\documentclass[12pt]{report}
\usepackage{atveryend}
\makeatletter
\AtVeryEndDocument{%
\if@filesw % respect \nofiles
\begingroup
% same write register as environment `filecontents` uses
\chardef\reserved@c=15 %
\immediate\openout\reserved@c=\jobname.heights\relax
\immediate\write\reserved@c{%
\string\setlength{\string\headheight}{\the\headheight}%
}%
\immediate\write\reserved@c{%
\string\setlength{\string\footskip}{\the\footskip}%
}%
\immediate\closeout\reserved@c
\endgroup
\fi
}
\makeatother
\InputIfFileExists{\jobname.heights}{}{}
\usepackage[
includehead,
includefoot,
a6paper,
landscape,
showframe,
]{geometry}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\chead{\Huge Header}
\cfoot{\Huge \begin{tabular}{c}Footer\\\thepage\end{tabular}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\begin{document}
Hello World
\end{document}
第一次运行
包装fancyhdr
警告:
Package Fancyhdr Warning: \headheight is too small (12.0pt):
Make it at least 30.0pt.
We now make it that large for the rest of the document.
This may cause the page layout to be inconsistent, however.
Package Fancyhdr Warning: \footskip is too small (30.0pt):
Make it at least 50.99991pt.
We now make it that large for the rest of the document.
This may cause the page layout to be inconsistent, however.
并且页面内容发生位移:
第二次运行
\jobname.heights
使用前面写的:
\setlength{\headheight}{30.0pt}
\setlength{\footskip}{50.99991pt}
没有任何警告,页面如下:
包的解决方法calc
软件包fancyhdr
有 bug,例如,\global\setlength
如果软件包已加载,则无法运行calc
。以下代码修补了宏\@fancyvbox
。
\makeatletter
\def\reserved@a#1#2{\setbox0\vbox{#2}\ifdim\ht0>#1\@fancywarning
{\string#1 is too small (\the#1): ^^J Make it at least \the\ht0.^^J
We now make it that large for the rest of the document.^^J
This may cause the page layout to be inconsistent, however\@gobble}%
\dimen0=#1\global\setlength{#1}{\ht0}\ht0=\dimen0\fi
\box0}
\ifx\reserved@a\@fancyvbox
\typeout{Patching \noexpand\@fancyvbox from package fancyhdr.}
\def\@fancyvbox#1#2{%
\setbox0\vbox{#2}%
\ifdim\ht0>#1\relax
\@fancywarning{%
\string#1 is too small (\the#1): ^^J%
Make it at least \the\ht0.^^J%
We now make it that large for the rest of the document.^^J%
This may cause the page layout to be inconsistent, however\@gobble%
}%
\dimen0=#1\relax
\global#1=\ht0\relax
\ht0=\dimen0 %
\fi
\box0 %
}
\fi
\makeatother
该代码应插入序言中后程序包fancyhdr
已加载。
答案2
fancyhdr 软件包已经更新 \headheight 或 \footskip
不完全正确:对于重音字母,fancyhdr 会忽略重音并将高度设置为所选字体大小。
例子:
\documentclass[a4paper, 12pt, twoside]{report}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead[RO, LE] {}
\begin{document}
\chapter{nothing, just setting a weird title: l\`ik\'e s\^o}
\newpage
\end{document}
在这个例子中,fancyhdr 将\headheight
章节标题的 \Large 大小设为 12pt。但是,带有重音符号的标题比不带有重音符号的标题大,LaTeX 会在第一个带有此类重音符号的标题处调整标题高度,从而使前几章的标题高度有所不同。
这应该是 fancyhdr 的默认设置,具体取决于语言。相反,如果章节中有重音字母,可以使用calc
's来纠正 fancyhdr 的疏忽heightof
。对于法语,最坏的情况是抑扬符,因此:
\setlength{\headheight}{\heightof{{\Large \^{E}}}}
固定头部高度。