如何在 ConTeXt 中仅包含单页可容纳的数据?

如何在 ConTeXt 中仅包含单页可容纳的数据?

我需要\include来自几个不同文件的数据,在单独的页面上显示每个文件的内容(例如,第 1 页上的 file1.tex,第 2 页上的 file2.tex),但如果文件内容无法容纳在一页中,则截断任何多余的数据。

我有一个简单的 ConTeXt 文档,如下所示:

\starttext
    \subject{File 1}
        \startitemize[n]
            \input file1
        \stopitemize
    \pagebreak
    \subject{File 2}
        \startitemize[n]
            \input file2
        \stopitemize
    \pagebreak
    \subject{File 3}
        \startitemize[n]
            \input file3
        \stopitemize
     ...
\stoptext

每个文件包含项目,\item每行前面都有。为简单起见,下面是示例内容file1.tex(其他文件也一样):

\dorecurse{100}{\item hello}

通常,ConTeXt 会包含文件,然后将后续项目包装到下一页。在上面的示例中,它到达项目 #23,然后将 #23-100 放在后面的页面上。如果项目 #23 是一个较长的段落,分页显示,则它应该在 #22 处截断(从不拆分项目)。

包含的文件的内容是自动生成的数据,但我只希望在页面上显示尽可能多的数据,任何多余的数据都是太多数据,需要丢弃且不需要报告。

我怎样才能让 ConTeXt 停在第 23 项(第一页的最后一项)处,并停止包含文档的其余部分,然后转到下一页?

答案1

在这个解决方案中,我只是将 之间的所有内容装入 中\start...\stopclippage\vbox然后我计算此时页面上的剩余空间,即\pagegoal-\pagetotal。将装箱的内容拆分到该高度,并丢弃拆分出的框。最后刷新该框。如果您想允许一些垂直拉伸和收缩,请使用\unvbox而不是\box

我认为这不会与网格很好地交互。

\unexpanded\def\startclippage{\par\setbox\scratchbox=\vbox\bgroup}
\unexpanded\def\stopclippage
    {\egroup
     \scratchdimen=\dimexpr\pagegoal-\pagetotal\relax
     \setbox\scratchbox=\vsplit\scratchbox to \scratchdimen
     \box\scratchbox}

\starttext
    \subject{File 1}
    \startclippage
        \startitemize[n]
            \input file1
        \stopitemize
    \stopclippage
    \pagebreak
    \subject{File 2}
    \startclippage
        \startitemize[n]
            \input file2
        \stopitemize
    \stopclippage
    \pagebreak
    \subject{File 3}
    \startclippage
        \startitemize[n]
            \input file3
        \stopitemize
    \stopclippage
    ...
\stoptext

在此处输入图片描述

相关内容