我想要“某些东西”(一个包,一个技巧,一个宏......?)使我可以很好地调整边距(或布局)以设置每行的平均或典型字符数。
理想情况下,这个“系统”将帮助我保持这个比例(66、2.5 个字母或我选择/输入的任何其他数字)不受字体系列变化(例如使用包pslatex
或txfonts
例如)、字体大小变化(例如使用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
宏从当前字体中获取字体大小,并从当前语言中选择字符频率。因此,应在指定文档字体和语言后使用它。