将某些页面的高度调整为其内容的高度

将某些页面的高度调整为其内容的高度

我正在处理的文档有两种页面:标题页和内容页。对于数字版本,最好将内容排版为单个连续页面。这些页面的高度必须根据内容的高度计算,而我很难做到这一点。

以下是一个例子:

\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 条目,但这可能会带来更多问题。

我知道 Adob​​e Reader 和其他一些软件都支持 CropBox。但有些 PDF 阅读器可能会忽略它,而始终使用 MediaBox。

如果实验成功,并且您的文档不太长,那么您可以选择编辑它,如上所述。显然不适合经常修改内容的文档。

请务必使用 Adob​​e Reader 测试已编辑的 PDF。此软件会报告其他一些 PDF 阅读器忽略的错误。如果已编辑的 PDF 可以在其他阅读器中看到,但在 Adob​​e 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}

尽管它基本上有效,但我感觉我正在使用一些我不完全理解的力量,所以我会等待一段时间,希望有专家技术人员能找到合适的解决方案。

相关内容