0
356 次浏览

有没有什么方法可以在偏离网格后重新回到网格上?或者在后台悄悄跟踪网格的同时,让某些文本处于网格之外?

我的书籍前几页是这样排版的:

MAIN TITLE
introductory outline (with \io markers)
\s
\p

问题是由 \io 部分引起的。我希望该部分的文本和行距比正常情况小,但如果这样做,\s 和 \p 就不在网格上了。我可以使用 \vskip 来修正,但由于每个引言的行数不同,每本书所需的 \vskip 值也会不同。(现在写下来我才意识到,如果没有办法回到网格,也许我可以通过为每本书编写一个 change 或 sethook 来解决这个问题。)

机器翻译自 English
PTXprint (1.9k 分) 发布 | 356 次浏览

2 个回答

0

嗯……有 \parlines,TeX 用它来告诉你一个段落中有多少行。
我想段落结束代码可以进行一些计数和计算……

机器翻译自 English
(1.1k 分) 发布

哎呀。抱歉,我之前的回复中有两个相当严重的错误。

  1. \@parlines 是我们用于计算缺失章节等的核算机制的一部分,我本应该写的是 \prevgraf
  2. \prevgraph 几乎能完全满足你的需求——将偏离网格的程度乘以该值,只要没有其他跳过、前后间距等情况,你就能得到一个“偏差 X pt”的值,然后可以用来恢复网格对齐,前提是先确保该值为正且小于 1 个网格线。这在 TeX 的第一次运行中就能全部生效。 但是这里有一个巨大的注意事项:
    只要前面的偏离网格的文本从未被跨页拆分,这一切都没问题。一旦到了那个地步,所有精细的计算都需要丢弃,因为页面上的所有文本都从第 1 基线开始。而且如果没有 @parlines 类型的处理,你就不知道文本中间某处的该段落有多少行位于新页面上。

所以……经过更多思考,我想不出一种方法,在包含分页符的情况下,如果不让 .parlocs 文件直接参与,就能做到这一点。到了那一步,说“我希望这个段落(光标当前位于 X,Y)在网格上”会更容易,而且根本不需要计算任何段落。至少对于第一次过渡是这样。
然后,如果它偏离网格,就需要重新运行 TeX。缺点在于,这可能会改变分页点和图片/脚注的位置,每次过渡可能需要 >= 一次重新运行!(天哪,如果你说的是整本圣经!)

机器翻译自 English
0

我认为这是一个相当普遍的问题,影响很多人,所以我们可能应该在引言结束和第 1 章开始时自动强制文本回到网格上。(我们可以以编程方式做到这一点,让用户无需费心吗?)

机器翻译自 English
(3.2k 分) 发布

如果我们要让这在所有情况下都能工作,我提到的巨大注意事项就适用了。鉴于人们可能有跨多页的引言,我认为我们实际上需要 (a) 为每个非常规间距的段落编号,以及后续整页的其他段落,(b) 计算哪个段落被拆分以及拆分点位于段落中的第几行。(c) 记住这一点,以便在下一次运行时,当我们到达“恢复网格”时。

另一种选择是我们目前在从单栏过渡到双栏时所做的:部分填充的页面被排版并固定,其他材料添加在下方。这在双栏模式下会导致不同的问题,例如……平衡问题。

机器翻译自 English

在任意给定时间点,TeX 不知道自己在页面上的位置吗?它只知道相对于上一行的正值吗?我不明白为什么没有一种方法可以说“章节编号位于 y 值 a,下一条网格线位于 y 值 b,因此我们需要将章节基线向下移动 b-a”。

另一种选择是我们目前在从单栏过渡到双栏时所做的:部分填充的页面被排版并固定,其他材料添加在下方。

实际上,在引发此问题的项目中,引言和正文都是单栏。这是我可以手动完成的吗——关闭当前页面并在下方开始新页面?

机器翻译自 English

TeX 在决定如何将其切割成页之前,已经准备好了“galley”(未中断的段落和间距列)。它总是在测试 galley 中的所有内容是否加起来构成一页之前完成一个段落,虽然它试图合理猜测何时触发分页,但这些猜测并不完全准确:为了获得栏平衡、脚注、交叉引用、图片和侧边栏以及一致的页尾,我们通常必须尝试较短的 galley 切割长度。因此,当新页面开始时,它的 galley 中可能已经堆积了大量的文本、图片和脚注。

当段落开始时(你需要添加额外空间的地方),\pagegoal\pagetotal 是已知的,但说实话,它们只是猜测,程序不知道例如页面上方可能会添加什么图片,或者是否会有任何拉伸弹性内容的调用。

是的,应该可以使其关闭部分页面,但可能无法手动完成。还有一些副作用可能会非常麻烦。
我突然想到另一个选项是使用可拉伸间距,有点像这样:

Stretch to page height{
  {figures}
  Stretch to 35 normal lines{
    {Intro paragraph (13.4 normal lines)}
    {stretchy bit}
    {main text (21 lines)}
  }
  {stretchy bit}
  {footnotes}
}

(新部分是中间部分的“Stretch to 35 lines”,当然,“35 lines”需要根据未拉伸的文本运行长度进行计算。)
@Martin_Hosken 可能想评论一下为什么这是一个愚蠢的想法。

机器翻译自 English

Offline David suggested \par\layoutstylebreak. That didn’t work, but looking at how it was used in other documents I ended up trying out \singlecolumn, and it works!!! Even though I’m switching from single column to single column that seems to be enough to reset the grid.


That solution raised another question:

My .sfm document now looks like

\io a bunch of introductory outline rows
\\p ~
\zgetbackongrid\*
\s The first section title

and my *mods.text file has this:

\sethook{end}{zgetbackongrid}{\singlecolumn}

But, I can’t get it to work without that \\p ~ line, which then adds in an extra blank line which I don’t want. I’m assuming the problem is that my milestone zgetbackongrid is still inside the \io paragraph, but I can’t figure out how to get out of that paragraph without adding the extra line. The \par that David originally suggested in conjunction with layoutstylebreak seems to not be allowed within a sethook.

如果 \zgetbackongrid\* 是一个否则为空的里程碑,你可以彻底尝试让它在内部扩展以执行操作(没有保证,我没有测试过):

\expandafter\def\csname MS:zgetbackongrid\endcsname{\par\singlecolumn}

它可能不起作用。里程碑代码期望(最多)生成一些字符级文本,并且有各种复杂的位以确保样式设置等不会逃逸。

机器翻译自 English

使用你的代码并没有导致 \par 出错,但它似乎也没有像使用 .sfm 文件中的 \p 那样重置网格。

然而,以下方法最终起作用了,所以我认为我可以在没有额外空格的情况下重置网格:
在 sfm 文件中放入 \p ~
在 *mods.tex 文件中,使用这个:
\sethook{end}{zgetbackongrid}{\vskip-1\baselineskip\singlecolumn}

感谢你们所有的帮助。

机器翻译自 English

未找到相关问题

Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
How good and pleasant it is when God’s people live together in unity!
Psalm 133:1
3,046 个问题
6,006 个回答
5,671 条评论
2,027 位用户