根据页眉的自然高度动态 \headheight?

根据页眉的自然高度动态 \headheight?

是否可以动态设置当前页面的高度\headheight以匹配当前页面页眉的自然高度?或者通过插入来模拟它\vspace

例如,以下文档在每个页面的页眉中插入一个具有随机高度(10 到 60 点之间)的规则:

\documentclass{article}
\setlength{\parindent}{0pt}
\usepackage[
  papersize={5in,2.5in},
  margin=0in,
  includehead,
]{geometry}
\usepackage[first=10, last=60]{lcg}
\usepackage{etoolbox}
\makeatletter
\newrobustcmd*{\hdr}{\rand\rule{1pt}{\therand\p@} The rule is
  \arabic{rand} points high}
\pagestyle{myheadings}
\markright{\hdr}
\usepackage{lipsum}
\begin{document}%
\lipsum%
\end{document}

在本文档中,您会注意到页眉通常会延伸到文本中。我希望每页上的文本始终\headsep从页眉基线以下开始,无论该页上的页眉有多高。

(使用随机数可能不是说明此问题的最佳方式,因为我不确定如果文档经过多次传递会发生什么。但希望我的观点能够得到表达。)

答案1

MWE 的设置方式使问题变得更加困难。问题是

\newrobustcmd*{\hdr}{\rand\rule{1pt}{\therand\p@} The rule is \arabic{rand} points high}

意味着在排版页眉之前,您不知道页眉的高度。问题是,如果您在排版页面之后才知道页眉的高度,那么您将陷入循环,因为排版页面需要知道文本高度,这需要知道页眉高度,而页眉高度当然在排版页面之后您才知道。从评论来看,这似乎不是问题的关键部分。稍微重新定义一下,问题就会容易\hdr得多

\renewrobustcmd*{\hdr}{\rule{1pt}{\therand\p@} The rule is
  \arabic{rand} points high (\the\paperheight, \the\headsep, \the\headheight, \the\textheight)\rand}
\rand

这样,我们在排版页眉之前就知道页眉的高度,并为下一个页眉设置一个随机长度。然后问题就变成了在每一页之后更改和\headheight\textheight您可能可以使用everyshi包,但我选择了afterpage包。将以下内容添加到您的 MWE 中可获得所需的结果

\usepackage{afterpage}
\makeatletter
\renewrobustcmd*{\hdr}{\rule{1pt}{\therand\p@} The rule is
  \arabic{rand} points high (\the\paperheight, \the\headsep, \the\headheight, \the\textheight)\rand}
\rand
\newcommand{\myafter}{%
  \afterpage{%
    \global\headheight=\therand\p@\relax%
    \global\textheight=\dimexpr\paperheight-\headheight-\headsep\relax%
    \myafter%
  }%
}
\headheight=\therand\p@\relax%
\textheight=\dimexpr\paperheight-\headheight-\headsep\relax%
\myafter
\makeatother

完整的 MWE 为:

\documentclass{article}
\setlength{\parindent}{0pt}
\usepackage[
  papersize={5in,2.5in},
  margin=0in,
  includehead,
]{geometry}
\usepackage[first=10, last=60]{lcg}
\usepackage{etoolbox}
\makeatletter
\newrobustcmd*{\hdr}{\rand\rule{1pt}{\therand\p@} The rule is
  \arabic{rand} points high}
\pagestyle{myheadings}
\markright{\hdr}
\usepackage{lipsum}


\usepackage{afterpage}
\makeatletter
\renewrobustcmd*{\hdr}{\rule{1pt}{\therand\p@} The rule is
  \arabic{rand} points high (\the\paperheight, \the\headsep, \the\headheight, \the\textheight)\rand}
\rand
\newcommand{\myafter}{%
  \afterpage{%
    \global\headheight=\therand\p@\relax%
    \global\textheight=\dimexpr\paperheight-\headheight-\headsep\relax%
    \myafter%
  }%
}
\headheight=\therand\p@\relax%
\textheight=\dimexpr\paperheight-\headheight-\headsep\relax%
\myafter
\makeatother


\begin{document}%
\lipsum%
\end{document}

相关内容