包的解决方法calc

包的解决方法calc

我正在创建三个文档,其中包含三个不同的页眉,包含图像或大型横幅。有没有办法自动确定页眉高度,或者更好的方法是根据内容自动更改页眉高度?

我知道 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.heightsgeometry.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}}}}

固定头部高度。

相关内容