如何使用 luatex 根据页码更改页边距?

如何使用 luatex 根据页码更改页边距?

由于某些原因,我有一份 100 多页的LaTeX文档,需要按以下方式进行格式化:

  • 如果\thepage = 1(模 4),则边距必须设置为 5 厘米;
  • 如果\thepage = 2(模 4),则边距必须设置为 4cm;
  • 否则边距必须设置为 2cm。

geometry包提供了用于设置序言外边距的宏,即\newgeometry\restoregeometry

现在我需要一种方法来自动将它们插入到每页的开头。

不幸的是,由于输出例程的工作方式,这似乎是不可能的(参见下面一个不起作用的解决方案的示例)。

\documentclass{article}
\usepackage{geometry}
\geometry{a4paper, margin = 2cm}
\usepackage{lipsum}

% https://tex.stackexchange.com/questions/34424/how-do-i-calculate-n-modulo-3-in-latex
\def\truncdiv#1#2{((#1-(#2-1)/2)/#2)}%
\def\moduloop#1#2{(#1-\truncdiv{#1}{#2}*#2)}%
\def\modulo#1#2{\number\numexpr\moduloop{#1}{#2}\relax}%

\makeatletter
\let\@@outputpage\@outputpage
\def\@outputpage{%
  \ifcase\modulo{\thepage}{4}\relax
  % Page 4
  \or
  % Page 1
  \newgeometry{margin = 5cm}%
  \or
  % Page 2
  \newgeometry{margin = 4cm}%
  \or
  % Page 3
  \restoregeometry
  \fi
  \@@outputpage}
\makeatother

\begin{document}
\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum

\lipsum
\end{document}

我想知道luatexlua 端的回调是否可以对此事有帮助?

答案1

如果有人能提出一个自动化的解决方案,我会感到非常惊讶和高兴。

LaTeX 一次排版一个段落。如果一个段落从一页延伸到下一页,则两页上的段落文本将使用相同的布局设置。如果您想将布局从一页更改为下一页,您必须确保第一页的结尾与段落的结尾重合,而下一页的开头是段落的开头(并在两者之间更改布局)。

我不认为这可以自动完成。但是,该类memoir包含一个宏,\parnopar定义为:

\newcommand{\parnopar}{\parfillskip=0pt\par\parskip=0pt\noindent}

将其插入段落中间会创建一个“不可见”的结束/开始段落。可以像这样使用:

Lots of text and now at the bottom of the page
\parnopar
% change the layout (via geometry or changepage packages or ...)
continuation of lots of text

不幸的是,可能需要多次尝试才能插入\parnopar段落文本的最佳位置。

PS:我觉得你的文档的版式要求很奇怪。我不太确定我是否愿意阅读它,但想必这不是由你决定的。

相关内容