我正在处理的文档有两种页面:标题页和内容页。对于数字版本,最好将内容排版为单个连续页面。这些页面的高度必须根据内容的高度计算,而我很难做到这一点。
以下是一个例子:
\documentclass{article}
\usepackage{lipsum}
\newsavebox\stagingbox
\newenvironment{content}
{%
\begin{lrbox}{\stagingbox}%
\begin{minipage}{\textwidth}%
}
{%
\end{minipage}%
\end{lrbox}%
%
% \textheight is theoretically just the total height of the box
\textheight=0pt\relax%
\advance\textheight by \ht\stagingbox\relax%
\advance\textheight by \dp\stagingbox\relax%
%
% \paperheight is made up of the various margins and distances
% of the class' page layout parameters plus \textheight
\paperheight=0pt\relax%
\advance\paperheight by 1in\relax%
\advance\paperheight by \voffset\relax%
\advance\paperheight by \topmargin\relax%
\advance\paperheight by \headheight\relax%
\advance\paperheight by \headsep\relax%
\advance\paperheight by \textheight\relax%
\advance\paperheight by \footskip\relax%
%
\pdfpageheight=\paperheight\relax%
%
\noindent%
\usebox{\stagingbox}%
\newpage%
}
\parindent=0pt\relax
\begin{document}%
Page with default size.%
\newpage%
\begin{content}%
Page with height adjusted to content. Following pages' height should also be adjusted to their content.%
\end{content}%
\begin{content}%
\lipsum[1]%
\end{content}%
\begin{content}%
\lipsum%
\end{content}%
Another page with default size.%
\end{document}
LuaTeX 1.0.4 报告了几个过满的垂直框,好像我在计算中忘记了什么。页面在输出中似乎也被裁剪了。我在这里遗漏了什么?
我知道还有另一种方法,即挂接\shipout
并使用\pagetotal
以获取页面宽度。不幸的是,我无法让它只对某些页面起作用(而不是对整个文档起作用)。关于主题:
我尝试过\AtNextShipout
,甚至弄乱了输出例程,但无济于事。
答案1
虽然我无法以“TeX 方式”回答您的问题,但我相信我可以提供有用的信息来指导您找到解决方案。
您的问题涉及数字版本,这意味着(我假设)文档 PDF 将在显示器上查看,而不是打印到纸上。如果要打印到纸上(尤其是商业打印机),则应忽略以下建议。
在 PDF 技术中,“MediaBox”是指页面的整个大小,无论是否打印了所有部分。事实上,特别是在商业应用中,页面的某些部分通常不打印,或者打印后被剪掉,因此最终用户看不到它们。TeX 将其称为“纸张大小”。每个 PDF 都有它。
当打印到纸张上时,最终(剪切)尺寸是“TrimBox”。
当使用兼容软件在显示器上查看时,可见部分是“裁剪框”。
这些框是嵌套的:MediaBox >= CropBox >= TrimBox。通常,CropBox 与 MediaBox 完全相同。那么,CropBox 就不是必需的。如果 TrimBox 大小相同,则不需要它(PDF/X 除外,它始终是必需的)。
在您的案例中,相关框是 CropBox。因此,您要做的就是确保 CropBox 在每个页面的基础上进行更改。您不必在每个页面的基础上更改 MediaBox。
大多数 TeX 编译器只是将 MediaBox、CropBox 和 TrimBox 设置为相同。通常,只设置 MediaBox,其余的默认大小相同。使用 LuaLaTeX(可能还有 pdflatex),可以将 CropBox 和 TrimBox 设置为与 MediaBox 不同的大小。但是,我只全局这样做了。我不知道当 CropBox 在每个页面的基础上更改时它是否有效。我相信它确实有效,尽管必要的代码可能无法直接在 TeX 中使用。
实验:创建几页 PDF。编译时不使用 PDF 压缩,这样您就可以在十六进制编辑器中轻松理解 PDF 代码。即\pdfcompresslevel=0
在序言中。在十六进制编辑器中打开 PDF,并查找CropBox
每页。将有四个数字,代表显示器可见页面左下角和右上角的 XY 坐标(以 Postscript 点为单位)。编辑 CropBox。然后,查看编辑后的 PDF。您也可以使用 MediaBox 条目,但这可能会带来更多问题。
我知道 Adobe Reader 和其他一些软件都支持 CropBox。但有些 PDF 阅读器可能会忽略它,而始终使用 MediaBox。
如果实验成功,并且您的文档不太长,那么您可以选择编辑它,如上所述。显然不适合经常修改内容的文档。
请务必使用 Adobe Reader 测试已编辑的 PDF。此软件会报告其他一些 PDF 阅读器忽略的错误。如果已编辑的 PDF 可以在其他阅读器中看到,但在 Adobe Reader 中看不到,那么该pdftk
软件可能能够修复它。
编辑:如果您的 PDF 还没有 CropBox 信息,请参阅该问题的接受答案,了解如何添加它:如何在 \pdfpageattr 中使用宏但是,在\pdfpageattr
命令中,仅使用带有 CropBox 的行。MediaBox 会自动添加,您不需要 TrimBox 或 BleedBox。
答案2
经过多次修改,我终于让它工作起来了,并抽象出了aphtc
包裹.其用法:
\documentclass{article}
\usepackage{aphtc}
\usepackage{lipsum}
\begin{document}%
Page with default height.%
\begin{adjustpageheight}%
Page with height adjusted to content. Following pages' height should also be adjusted to their content.%
\newpage%
\lipsum[1]%
\newpage%
\lipsum%
\end{adjustpageheight}%
Another page with default size.%
\end{document}
尽管它基本上有效,但我感觉我正在使用一些我不完全理解的力量,所以我会等待一段时间,希望有专家技术人员能找到合适的解决方案。