目前我正在尝试使用 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 的输出程序配合使用,因此这不会轻易有所帮助)。