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 是我們用來計算掉行章節(dropped chapters)等內容的會計部分,我本來應該寫 \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.
If anyone destroys God’s temple, God will destroy that person; for God’s temple is sacred, and you together are that temple.
1 Corinthians 3:17
3,046 個問題
6,006 個回答
5,671 則評論
2,027 位使用者