默认情况下,(La)TeX 会在句子之间添加额外的空格。具体规则请参见电子书,可以找到 TH 的总结。这里。以下是我的“执行摘要”:
在任何不跟大写字母的句号(或引号/感叹号)之后,TeX 都会将字体的“额外空格”添加到“正常(单词间)空格”中。对于 Computer Modern 10pt,正常空格为 3.33pt,额外空格为 1.11pt,因此句子间空格为 4.44pt(与正常空格相比增加 33%,假设不拉伸和收缩)。
大写字母后的句子结束用以下命令表示
\@
:Ann is learning the ABC\@.
要表示小写字母后的句号不是句子的结束,可以使用\@
明确的空格:Prof.\@ Higgins
或Prof.\ Higgins
。
可以通过发出命令将句子间距调整为正常间距\frenchspacing
。(这是某些语言的标准设置,例如 软件包(n)german
的选项babel
。)\frenchspacing
启用后,无需使用该\@
命令。可以通过发出恢复为 (La)TeX 的默认行为\nonfrenchspacing
。
因此,可以选择额外的句子间距和统一的间距。我认为缺少的是第三个选项,我称之为“紧缩的法语间距”:句子之间的正常(单词间)间距和减少非句子结尾句号后的间距。为了更精确一些(同时仍然忽略拉伸和收缩),我设想如下:
根据字体的“正常间距”和“正常间距加额外间距”之间的比例(Computer Modern 为 3:4),句子间间距设置为正常间距。非句子结尾句号后的间距等于正常间距乘以上述比例(Computer Modern 的间距为 2.5pt)。
与
\nonfrenchspacing
实际上一样,该\@
命令用于表示特殊标点符号的情况。
这种“缩小法语间距”选项应如何实施?
编辑:感谢 Mico 提供的解决方案,这可能是解决问题的垫脚石。以下是另一次澄清尝试:
只需减少间距即可任何句号不是我想要的。句子结尾的空格和非句子结尾的句号后的空格之间应该有(明显的)区别(只是后者应该减少,而前者应该增加)。
如果无法遵守字体的正常空格/额外空格比率,则可以接受在非句子结束句号后添加固定(减小)空格(例如,细空格)的解决方案。
出于兼容性原因,我更倾向于使用与传统用法兼容的解决方案
\@
(即允许现有文档使用“紧缩的法语间距”,而无需更改文档主体)。如果事实证明需要一组不同的“特殊标点符号”宏,我会接受此解决方案。
答案1
我不明白:“Dr. Doolittle”中的空格应该与正常的单词间距相同。我从未见过在这种情况下使用减小的间距,唯一使用减小间距的地方是在首字母之间:有人告诉写
D.\,E.~Knuth
代替
D.~E.~Knuth
(我更喜欢这种方式,但这只是个人喜好)。无论如何,你的“非句子结尾句号”应该以某种方式标记,所以何必呢?
笔记。我通常将领带放在姓氏前面,这样如果出现排版问题,可以很容易地将其更改为正常空格。
添加
正如我所说,“非句子结尾句号”必须以某种方式标记。由于您正在使用\frenchspacing
,我们可以重载\@
:
\frenchspacing
\makeatletter
\def\@{\@ifnextchar.{.\,\@gobbledot}{}}
\def\@gobbledot#1{\ignorespaces}
\makeatother
这边走
Dr\@. Treemunch i.e\@. a main character in ``The Joy of TeX''
会导致句号后的空间减少。我不明白如何自动识别“非句子结尾句号”,因为它们既可以位于大写字母后面,也可以位于小写字母后面。
答案2
首先:我必须承认,我从来没有见过这样的印刷例子:较少的(大多数) 标点符号后的间距比普通单词之间的间距大。
在我看来,实现目标的最简单方法是使用包microtype
,特别是它的命令\SetExtraSpacing
(第 5.5 节,第 19f 页)。例如,您可以发出命令
\SetExtraSpacing
[ unit = space ] % default
{ font = */*/*/*/* }
{ . = {-500,-500,-500},}
指示 pdftex 在句号(句号)后分配的空间是所有其他单词间空间的一半。问号和感叹号也是如此。将因子设置为 -1000 将完全抑制单词间空间。(当然,您应该已经发出命令来\frenchspacing
抑制标点符号后的多余空格......)
在看到 lockstep 的进一步解释后,还有以下补充评论:
我猜想,要使这个(非句末标点符号后的间距减小)发挥作用,必须有一种方法让 (La)TeX 区分“普通”即句末标点符号和“特殊”标点符号(所有其他标点符号)。假设人们可以假设所有句子都以大写字母开头,并且这是这些大写字母可能出现的唯一位置。(当然,这绝对是不是对于除英语以外的大多数语言来说都是如此。)如果这个假设是正确的,那么可以定义一个前瞻宏,每次遇到标点符号后跟(一个或多个)空格字符时,检查下一个字符是否为大写。如果下一个字符是大写,则标点符号被视为“正常”。相反,如果下一个字符是小写,则单词之间的间距将减少一些(适当的)量。
或者,如果您有一个支持 unicode 的文本编辑器,您可以用一些保证不会在文本中任何地方出现的字形替换所有有问题的标点符号;然后您可以\SetExtraSpacing
只对这些特殊字符运行 microtype 的命令,并在过程中用正确的标记(点、问号等)替换它们。
出于完整性考虑,我在最初的帖子中没有提到,为了\SetExtraSpacing
产生效果,microtype 包必须加载选项spacing=true
。以下是完整的 MWE,说明了所有句号后空格将减少三分之二。(我知道,我知道,这是不是原始问题是什么。
\documentclass{article}
\frenchspacing
\usepackage{lipsum}
\usepackage[spacing=true]{microtype}
\SetExtraSpacing{ font = * }{ . = {-667,-667,-667} }
\begin{document}
\lipsum[1-2]
\end{document}
答案3
虽然这对您的特殊情况没有帮助,但可以使用以下命令动态调整额外的空间跳过\xspaceskip
:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\begin{document}
[hello. there] [hello\@. there] [hello.\@ there]\linebreak
\bigskip
\frenchspacing
[hello. there] [hello\@. there] [hello.\@ there]\linebreak
\bigskip
\nonfrenchspacing
\xspaceskip=0.5\fontdimen2\font plus 0.5\fontdimen3\font minus 0.5\fontdimen4\font
[hello. there] [hello\@. there] [hello.\@ there]\linebreak
\end{document}
你所追求的通常困难之处在于它\@
没有做任何特别的事情;你可以把它看作是一个虚拟的(不可见的)小写字母。所以从 TeX 的角度来看(通常),hello\@. hello
和之间没有区别hello. hello
。
但是,重新定义命令肯定是可能的\@
;我不认为这里会有很多奇怪的边缘情况。