每行强制 66 个字符

每行强制 66 个字符

我想要“某些东西”(一个包,一个技巧,一个宏......?)使我可以很好地调整边距(或布局)以设置每行的平均或典型字符数。

理想情况下,这个“系统”将帮助我保持这个比例(66、2.5 个字母或我选择/输入的任何其他数字)不受字体系列变化(例如使用包pslatextxfonts例如)、字体大小变化(例如使用10pt或类选项)的影响。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

罗伯特·布林赫斯特(Robert Bringhurst)“印刷风格的要素”,给出了不同字体的首选行长表。对表格数据的最小二乘优化拟合表明,可以使用以下宏很好地近似:

\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语言频率表,以及语言频率.mkii用于计算平均宽度的宏。摘自文档:

此模块实现了一种确定语言中平均字符宽度的方法。它使用当前字体的尺寸。

方法~1 忽略宽度并假设每个字符的宽度为 .5em,这对于大多数等宽字体来说都是正确的。方法~2 将 x 作为起点,并假设其高度与其宽度相匹配。方法~3 是最好的方法,它根据特定于语言的字符表确定平均宽度。方法~4 是前两种方法的混合:将特定于字符的宽度应用于均等分布。方法~0 报告总数,通常为~100。

该文档还包括下图,显示英语、荷兰语和德语的频率表。

在此处输入图片描述

虽然文件有.mkii扩展名,但代码是相当低级的 TeX,并且也适用于 ConTeXt MkIV。经过少许修改后,它也应该适用于 LaTeX。

对于真正的“平均每行 66 个字符”,您可以先预处理文本以生成频率表,然后使用该频率表计算平均字符宽度!

笔记:该\averagecharwidth宏从当前字体中获取字体大小,并从当前语言中选择字符频率。因此,应在指定文档字体和语言后使用它。

相关内容