我读过数字的帖子询问为什么符号 > 和 < 错误地显示为 ¡ 和 ¿。解决方案是使用 T1 字体编码。好的。
我想了解为什么这些符号的显示方式与原始 OT1 字体编码相同。技术原因似乎是 < 的 ASCII 值用于表示 ¡,而 > 的值用于表示 ¿。但是,这背后的历史原因是什么?
另外,我知道,例如,原始 OT1 字体编码(A.1 节)不包括这两个符号。好的。但是为什么会\textless
生成\textgreater
正确的字形,这些字形来自哪里?还有其他字符,例如黑斜杠 () 和竖线 (|)。我怀疑这些原因也类似?
答案1
历史原因是 TeX 最初是在 20 世纪 70 年代末开发的,当时七位是常态(字节中的第八位用于奇偶校验)。
Knuth 开发的字体仅使用 7 位,因此只能容纳 128 个字形。为了提供尽可能多的有用字符,Knuth 不得不丢弃一些在普通文本中很少出现的字符。
前 32 个位置可以自由放置各种符号,但大写希腊字母、重音符号和 f 连字符已经占据了其中的 23 个。然后是无点的 i 和 j 以及字母 ß Æ æ Œ œ Ø ø,共计 32 个。
重要的文本符号,例如左双引号、en-dash 和 em-dash 以及 ¡ 和 ¿ 不在 ASCII 中,但在文本中使用。
相反,括号 {}、小于号和大于号 <> 在文本中不太常见。
只是一种权衡。请注意,当时还没有 Unicode,因此引入了连字符排版机制 !¿–—。
当 TeX 开始在欧洲传播时,使用带重音字母的单词时由于缺少连字符点而出现的问题推动了一种新字体编码的开发,于是 T1 诞生了,其中可打印 ASCII 字符的范围 (32–126) 包含了正确的 ASCII 字符。
我认为原始字体编码中存在大写希腊字母是一个错误。但 Knuth 的目标之一是不留下任何空缺,以避免出现大量不同的填补方式。
答案2
计算机不处理符号,它们处理数字,这<
意味着当前字体和 OT1 编码中的字符 60 是倒置的感叹号。在 T1 编码字体和任何其他基于 ASCII 或 Unicode 的字体编码中,该位置是小于号。
默认的 TeX 字体是为不同的时代设计的,并且是 7 位字体(或至少是 8 位,所有顶部插槽都是空的,因此,假设它<
应该在数学中,因此在文本字体中不需要,一些插槽被用来挤入额外的符号。
\textless
如果当前编码为 OT1,则定义和朋友从数学字体中提取字符。
答案3
这 2 行包含在latex.ltx
:
\DeclareTextSymbolDefault{\textless}{OML}
\DeclareTextSymbolDefault{\textgreater}{OML}
这样做的目的是定义这两个命令,使它们使用OML
编码中当前活动的字体,该字体主要用于数学。因此,它们OT1
根本不依赖于编码字体。
当您使用T1
编码时,这些默认值将被覆盖:
\DeclareTextSymbol{\textgreater}{T1}{`\>}
\DeclareTextSymbol{\textless}{T1}{`\<}
这确保命令使用编码中当前活动的字体T1
。因此,如果出于某种原因对数学和文本使用不同的字体,这些命令将按预期运行,T1
但不会按预期运行OT1
,因为在后一种情况下,即使在文本模式下也会使用数学字体(因为符号根本不可用)。
\textbackslash
类似地,和的默认定义\textbar
使用OMS
,另一种数学编码,并且,同样,如果您加载T1
,这些将被覆盖以使用T1
编码字体。
所有这些都是必要的,因为最初 TeX 只能使用具有 128 个插槽的字体编码。T1
有 256,这个数字直到后来 TeX 开发才成为可能。
OT1
请注意,用 代替这些字符而不是用其他编码¡
代替的原因之一¿
是对 中描述的连字符的依赖egreg 的回答。TeX 只能在单一字体编码中使用连字符。因此,如果¿
中没有OT1
,就不可能制作
?`
¿
例如,生成,而不将?
和 ` 也放入其他编码中。由于字距调整信息只能用于单一编码中的字符对,因此,这反过来又使得无法对这些符号之前或之后的字符进行适当的字距调整。
答案4
我无法谈论历史动机。但技术原因很明显:默认 Computer Modern Roman 字体的字体表包含 ¡ for < 和 ¿ for >。在不同的编码下,字体表具有不同的“正确”符号。\textless
并且\textgreater
在设置为本地的地方切换到更合适的字体之前。以下示例显示了cmr10
(典型默认值)、默认的 T1 字体编码和默认的 OML 字体编码的字体表。
查看以下最小示例的字体表:
\documentclass{article}
%\usepackage[T1]{fontenc}
\usepackage{fonttable}
\begin{document}
Just some <regular text> and \textless more text\textgreater.
\show\textless
\show\textgreater
\clearpage
\fonttable{cmr10}
\clearpage
\xfonttable{T1}{cmr}{m}{n}
\clearpage
\xfonttable{OML}{cmr}{m}{n}
\end{document}
常规的:
T1:
OMl:
具体看看位置60和62。