很好地強制每行 66 個字符

很好地強制每行 66 個字符

我想要有“東西”(一個包,一個技巧,一個宏,...?),使我可以很好地處理邊距(或佈局),以設置平均或典型數量每行字元數。

理想情況下,這個「系統」將幫助我保持這個比例(66、2.5個字母或我選擇/輸入的任何其他數字)獨立於字體系列(例如使用套件pslatextxfonts)、字體大小的變化(例如10pt或class 選項)。12pt

我環顧四周,我有點明白,使用 KOMA-Script 類別或該類別memoir可能是解決方案的一部分,但我寧願不這樣做(特別是因為到目前為止我從未使用過任何類別)。

對我來說重要的一點是必須保留原始佈局的整體比例或原則。例如,如果左右邊距之間有固定的比例,那麼,僅使用一個邊距或文字寬度/線寬就無法滿足我的需求。

為什麼我想做這個?因為我喜歡使用這個pslatex包,但這使得每行的平均字元數從沒有的大約 65 個增加到了大約 75+。

請注意,我已經瀏覽過或瀏覽過:

而且,那裡也可能有答案,但我無法(太容易)找到它們。

答案1

關於小寫字母長度的 2.5 倍的說法只是一個指示。不過你可以玩geometry

\documentclass{book}

%%\usepackage{newtxtext}
\newlength{\alphabet}
\settowidth{\alphabet}{\normalfont abcdefghijklmnopqrstuvwxyz}

\usepackage{geometry}
\geometry{textwidth=2.5\alphabet,hmarginratio={2:3}}

\begin{document}
\the\textwidth
\end{document}

這將使用指定的邊距比率(在雙面模式下,實際上 2:3 是預設值)。表現良好的字體包應該可以正常工作。

使用預設字體時,我得到的文字寬度為 318.96pt,而使用預設字體時,我newtxtext得到的文字寬度為 298.58pt(mathptmx結果為 298.57pt)。

請注意,這pslatex是一個非常過時的包,而且它的後代mathptmx對於涉及數學的嚴肅排版來說相當不夠。如果您不需要數學,基於 (Linotype) Times Roman 的其他選擇是

  • newtxtext(基於txfonts,但具有更正的指標)

  • tgtermes

前者有配套的數學包newtxmath

您可以選擇您喜歡的邊距比例。在雙面列印中,通常外邊距比內邊距寬。如果您想自動選擇單面列印(等邊距)和雙面列印,那麼

\geometry{textwidth=2.5\alphabet}
\makeatletter
\if@twoside
  \geometry{hmarginratio={2:3}}
\else
  \geometry{hmarginratio={1:1}}
\fi
\makeatother

可用於。的選項geometry可以在不同的\geometry命令中給出。不要忘記指定紙張尺寸(您可以在課堂選項中\geometry或作為課堂選項進行指定)。

您也可以測試載入的類別:

\makeatletter
\geometry{hmarginratio={1:1}} % fallback

\@ifclassloaded{book}
 {
  \if@twoside
    \geometry{hmarginratio={2:3}}
  \else
    \geometry{hmarginratio={1:1}}
  \fi
 }{}

\@ifclassloaded{article}
 {
  \if@twoside
    \geometry{hmarginratio={4:2}}
  \else
    \geometry{hmarginratio={1:1}}
  \fi
 }{}
\makeatletter

(設定 4:2 僅作為範例)。

然而,不存在「包羅萬象」的格式:您最終為文件選擇的內容取決於文件​​本身。


如何將水平邊距比例設定為等於類固定的水平邊距比例?這有點困難,因為標準設定使用的模型與geometry.

\documentclass{article}
\usepackage{newtxtext}
\usepackage{geometry}

\newlength{\alphabet}
\sbox0{\normalfont abcdefghijklmnopqrstuvwxyz}
\setlength{\alphabet}{\wd0}

\makeatletter
\begingroup
\dimendef\innermargin=\z@
\dimendef\outermargin=\tw@
\innermargin=\dimexpr\oddsidemargin+1in+\hoffset\relax
\outermargin=\dimexpr\paperwidth-\innermargin-\textwidth\relax
\outermargin=.002\outermargin
\innermargin=2\innermargin
\count@=\innermargin
\divide\count@ \outermargin
\xdef\standardhmarginratio{\number\count@:1000}
\endgroup

\geometry{textwidth=2.5\alphabet,hmarginratio=\standardhmarginratio}

\begin{document}

text width = \the\textwidth

horizontal margin ratio = \standardhmarginratio

\end{document}

對於該類article,我們得到 1000:1000,使用book(雙邊模式)結果是 667:1000,對於所有實際目的來說,即 2:3。

答案2

羅伯特·布林赫斯特,在《印刷風格的元素》,給出了不同字體的首選行長度表。表數據的最小二乘優化擬合表明,可以使用以下宏很好地近似:

\newcommand*\GetTextWidth[3][\normalfont]{{#1%
    \settowidth{#2}{abcdefghijklmnopqrstuvwxyz}%
    \setlength{#2}{0.03193#2}%
    \addtolength{#2}{0.44961pt}%
    \setlength{#2}{#3#2}%
    \global#2=#2}}

可以與geometry等一起使用來設定文字寬度

\newlength\bringhurstwdt
\GetTextWidth{\bringhurstwdt}{66}
\geometry{textwidth=\bringhurstwdt}

我認為這對於單字相對較短的標準英語是有效的。在像南非荷蘭語(我的母語)這樣的語言中,我們有很多很長的單詞,每行 66 個字符看起來並不總是正確。對於其他語言,良好排版的字元數可能有所不同,但我不知道什麼是最好的。

答案3

ConTeXt 提供了一個名為 的宏\averagecharwidth,可以根據語言特定的字元頻率計算字元的平均寬度。它沒有合適的接口,因此您必須手動載入所需的檔案。

 \input lang-frq.mkii %macros to calculate average length
 \input lang-frd.mkii %language frequency tables

 \setuplayout[width=66\averagecharwidth]

lang-frd.mkii對於語言頻率表,以及lang-frq.mkii用於計算平均寬度的宏。從文件中:

該模組實作了一種確定語言中平均字元寬度的方法。它使用當前字體的尺寸。

方法~1 忽略寬度並假設每個字元的寬度為 0.5em,這對於大多數等寬字體都是如此。方法~2 以 x 為起點,並假設它的高度與其寬度相符。方法~3 是最好的一種,它根據語言特定字元表確定平均寬度。方法~4 是前兩種方法的混合:將字元特定寬度應用於均勻分佈。 Method~0 報告總計數,通常為~100。

該文件還包括下圖,顯示英語、荷蘭語和德語的頻率表。

在此輸入影像描述

儘管這些檔案具有.mkii副檔名,但程式碼是相當低階的 TeX,並且也適用於 ConTeXt MkIV。它也應該可以與 LaTeX 一起使用,只需稍作修改。

對於真正的“平均每行 66 個字元”,您可以先預處理文字以產生頻率表,然後使用該頻率表來計算平均字元寬度!

筆記\averagecharwidth巨集從目前字體取得字體大小,並從目前語言選擇字元頻率。因此,應在指定文檔字體和語言後使用。

相關內容