ConTeXt:避免跨页面枚举项

ConTeXt:避免跨页面枚举项

如果每一项\item都是一个或多个段落,有时 ConTeXt 会将这些段落拆分到多个页面。在这种特定情况下,如果是单个段落,我宁愿 ConTeXt 在每一项之间拆分;如果是多个段落,我宁愿在段落之间拆分。我尝试过:

  • loose。这会充分改变项目组间距,有时(但并非总是)会将分页符移到项目之间。
  • inbetween={\page[preference]}。这太投机取巧了,在不需要的地方强行分页。它还会完全破坏packednowhitejoinedup关键字,尤其是当 时\setupwhitespace[big]
  • \start...stoplinecorrection。当项目组长度超过一页时,这显然不是理想的选择。

编辑:

下面的优秀答案提出了很多有趣的问题。我查看了在线 wiki、手册和游览教程,但找不到这些问题的答案。如果它们在其他地方有记录,只需在此处链接到它们,而不是重复所有内容。

您使用特定替代方案定义新的用户数据环境。我看到该关键字在整个 ConTeXt 中被使用,并假设它是每个单独宏特有的枚举,即每个枚举值都会触发硬编码到宏定义中的行为。但在这里您定义了一个全新的替代方案。这是什么意思?在哪个阶段使用或调用替代方案?它的范围是什么;它做什么?

在替代方案中,您可以覆盖“renderingsetup”关键字。关于此问题也有类似的问题。我假设它会影响页面渲染开始之前的新用户数据环境。为什么必须使用替代方案来覆盖“renderingsetup”?

在设置中,您定义了一个新框和内容。为什么禁用以下空白?

然后测试盒子的高度。我想问一下在渲染之前(即在 中)如何实现这一点renderingsetup,但这更像是一个 TeX 问题,所以没关系。

如果盒子的高度小于,则\textheight只需插入盒子(包含内容)。如果高度小于,拆箱是个好主意吗\pagegoal

另外,为了澄清较长的项目:一个项目由几个段落组成。目前只有段落,但将来可能会有一个或两个嵌套的项目列表。我只希望段落之间有分页符,但有两个例外:

  • 切勿在第一段之后分页,因为它有点像标题。
  • 如果段落长度超过,则仅将其分成几部分0.25\textheight,但您的答案已经演示了如何做到这一点。

但这似乎相当高级。我是否应该将其作为一个新问题,以演示带索引的 for 循环、自省(索引处的项目是段落还是胶水?)等?

答案1

这里没有预定义的选项itemize可以提供帮助,因为条目不知道在哪一页开始和结束。

将条目内容放在一页上的一个简单方法是将所有内容放在一个框中,这样可以防止中间出现一页。

在下面的例子中,我使用userdata环境将每个项目的内容存储在缓冲区中,然后将其放入 中\vbox。这种方法并不完美,因为许多条件itemize不再起作用,我必须使用\blank[disable]来摆脱在每个项目开头插入的空行。

\defineuserdataalternative
  [itemize]
  [renderingsetup=userdata:itemize]

% \startsetups [userdata:itemize]
%   \setbox\scratchbox\vbox {
%     \blank[disable]
%     \startitem
%       \getinlineuserdata
%     \stopitem
%   }
%   \ifdim\ht\scratchbox>\textheight
%     \page\unvbox\scratchbox
%   \else
%     \box\scratchbox
%   \fi
% \stopsetups

\startsetups [userdata:itemize]
  \vbox {
    \blank[disable]
    \startitem
      \getinlineuserdata
    \stopitem
  }
\stopsetups

\defineuserdata [item] [alternative=itemize]

\setuppapersize [A5]

\starttext

\startitemize
  \startuserdata [item]
    \samplefile{zapf}
  \stopuserdata
  \startuserdata [item]
    \samplefile{ward}
  \stopuserdata
  \startuserdata [item]
    \samplefile{tufte}
  \stopuserdata
  \startuserdata [item]
    \samplefile{weisman}
  \stopuserdata
\stopitemize

\stoptext

在此处输入图片描述

当您的目标只是将条目中的段落保持在一起但不介意它们之间有间隔时,您可以使用该\keeplinestogether命令。

% \define\ItemizeCommand
%   {\keeplinestogether{20}}

\define\ItemizeCommand
  {\EveryPar{\keeplinestogether{20}}}

\setupitemize
  [command=\ItemizeCommand]

\setuppapersize [A5]

\starttext

\startitemize
  \startitem
    \samplefile{zapf}
  \stopitem
  \startitem
    \samplefile{ward}
  \stopitem
  \startitem
    \samplefile{tufte}
  \stopitem
  \startitem
    \samplefile{weisman}
  \stopitem
\stopitemize

\stoptext

在此处输入图片描述

相关内容