在第一页之后更改页面布局

在第一页之后更改页面布局

目前我正在尝试使用 XeLaTeX 准备信头。信的第一页右侧应该有一个侧边栏。对于这个侧边栏,文本宽度应该缩小到正常大小的约 80%,这样文本就不会进入侧边栏。对于接下来的页面,文本宽度应该是正常的,即没有任何额外的边距。

我意识到在 LaTeX 文档中间更改页面布局不是一项简单的任务,并且存在一些解决方案,例如包\newgeometry中的命令geometry

atbegshi我的第一个想法之一是将包与包结合使用geometry,以便在第一页之后实现所需的布局变化:

\documentclass{article}
\usepackage{atbegshi}
\usepackage{geometry}
\usepackage{lipsum} % just to have dummy texts

% define the main page layout
\geometry{a4paper, includeall, left=10mm, right=10mm, top=10mm, bottom=10mm, head=0mm, foot=0mm, marginpar=0mm, marginparsep=0mm, headsep=0mm}

% restore the main page layout for all following pages
\AtBeginShipoutNext{\restoregeometry}

\begin{document}
    % define a new page layout for the first page
    \newgeometry{left=10mm, right=50mm, top=10mm, bottom=10mm, head=0mm, foot=0mm, marginpar=0mm, marginparsep=0mm, headsep=0mm}

    \lipsum[1-30]
    \clearpage        
    \lipsum[31-50]

\end{document}

不幸的是,这行不通。似乎每个atbegshi钩子(\AtBeginShipout\AtBeginShipoutFirst\AtBeginShipoutNext)都会忽略\newgeometry\restoregeometry命令。

我尝试了其他几种方法,但是这个方法似乎是最复杂的,因为它可以提供一种非常干净的方法来仅针对第一页更改页面布局(例如,考虑以下 MWE;由于某种原因不起作用):

\documentclass{article}
\usepackage{atbegshi}
\usepackage{geometry}
\usepackage{lipsum} % just to have dummy texts

% define the main page layout
\geometry{a4paper, includeall, left=10mm, right=10mm, top=10mm, bottom=10mm, head=0mm, foot=0mm, marginpar=0mm, marginparsep=0mm, headsep=0mm}

% define the first page layout
\AtBeginShipoutFirst{\newgeometry{left=10mm, right=50mm, top=10mm, bottom=10mm, head=0mm, foot=0mm, marginpar=0mm, marginparsep=0mm, headsep=0mm}}

% restore the main page layout for all following pages
\AtBeginShipoutNext{\restoregeometry}

\begin{document}

    \lipsum[1-30]
    \clearpage        
    \lipsum[31-50]

\end{document}

还有其他方法可以实现所需的结果吗?或者这只是我在使用atbegshi/时遇到的一个错误geometry

注意:
因为我不知道要放在第一页的文本也不知道它的长度,所以\restoregeometry无法手动放置命令。

答案1

在 TeX 使用的模型中,除了手动或在非常有限的环境中,没有其他方法可以实现您的目标。由于 TeX 首先生成段落,并且只在段落末尾检查是否要剪切页面,因此您最终会在第二页上看到段落的某些部分已经排版(因此宽度与上一页相同)。

您可以通过手动拆分段落(并有效地重新启动新段落(之后使用不同的设置))来实现您的目标。 即,如果您知道第一页的最后一个单词是什么,您可以在此时放置特殊命令,例如。\EndOfFirstPage在序言或类文件中定义此命令,如下所示:

\newcommand\EndOfFirstPage{%
  \setlength\parfillskip{0pt}%  line should end at the right
  \par                       %  finish paragraph for now
  \setlength\parfillskip{0pt plus 1fil}% default again
  \pagebreak
   ...                        % <--- change your geometry settings here
  \noindent                   % new paragraph on the new page that claims to be
                              % a continuation
}

当然,每当您稍后更改第一页的文本时,您可能需要移动分割点。或者您可以将上述方法与您的方法结合起来,使用用于atbegshi设置几何图形的包和仅\EndOfFirstPage用于产生分割的包。这样做的好处是,即使没有命令来指示分割(只有分页符处的部分是错误的),几何图形也几乎是正确的,并且您可以将添加延迟\EndOfFirstPage到您基本完成编辑的时间。

自动方法将涉及跟踪您在页面上的位置(还有多少行可以容纳),以某种方式捕获未排版的每个段落,尝试排版以确定其长度,然后如有必要生成一个复合体,\parshape以便页面上最后一段的行在页面边界上改变宽度。

归根结底,这样的事情并不存在,而且它绝不是可以轻易甚至不可能可靠解决的事情(过去 20 年里没有一位专家克服过这个限制)。我们现在认为,我们在 LaTeX3 项目中确实有代码,但到目前为止还只是一个想法(而且它不能与当前 2e 的输出程序配合使用,因此这不会轻易有所帮助)。

相关内容