TeX 的引号排序机制是如何工作的?

TeX 的引号排序机制是如何工作的?

当我输入``hello''TeX 时,它会非常巧妙地将其重新格式化为更漂亮的版本"hello"。这种机制似乎深藏在 TeX 的深处(我无法在我常用的资源 TeXbyTopic 中找到它)。

似乎就像字体一样,因为如果我这样做\ttfamily(在 LaTeX 中)以获得等宽字体,那么这个自动替换就会被关闭。我真的很想再次打开它,这样\ttfamily我仍然可以获得"hello"。将'`定义为活动字符似乎对这项任务来说有点危险(尽管我很高兴被证明是错的)。

答案1

使用支持此类连字的字体

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\begin{document}
``foo'' and \ttfamily``bar''

\end{document}

答案2

这与从输入fi产生连字的机制相同。它确实依赖于字体。如果你这样做

tftopl cmr10

除其他外,你还能获得

(LIGTABLE
   ...
   (LABEL O 140)
   (LIG O 140 O 134)
   (STOP)
   ...

意思是:当字符 '140(八进制,反引号)后面跟着另一个字符 '140 时,用字符 '134 替换它们。如果当前字体没有此信息,则不会进行替换(并且cmtt10没有这样的条目)。此类连字符在 Metafont 源中定义。对于非 Metafont 生成的字体,程序afmtotfm或包方廷斯特如果需要,在生成文件时添加连字程序.tfm

当 TeX 被指示加载字体时,例如cmr10,它实际上会读取cmr10.tfm包含通过程序以“人类”形式看到的紧凑格式的内容tftopl。这两个字符必须使用相同的字体:

`\bfseries`

不会给予连字符。

XeTeX 使用另一种方法。一些连字由字体本身定义(fi例如),但诸如 之类的东西则''不是。为了从相同的源获得“相同”的输出,您可以指定使用 TecKit 技术的“映射文件”。添加到字体名称的指令是mapping=tex-text,它将与字体一起加载tex-text.tec一个紧凑形式的文件tex-text.map

; TECkit mapping for TeX input conventions <-> Unicode characters

LHSName "TeX-text"
RHSName "UNICODE"

pass(Unicode)

; ligatures from Knuth's original CMR fonts
U+002D U+002D                   <>      U+2013  ; -- -> en dash
U+002D U+002D U+002D    <>      U+2014  ; --- -> em dash

U+0027                  <>      U+2019  ; ' -> right single quote
U+0027 U+0027   <>      U+201D  ; '' -> right double quote
U+0022                   >      U+201D  ; " -> right double quote

U+0060                  <>      U+2018  ; ` -> left single quote
U+0060 U+0060   <>      U+201C  ; `` -> left double quote

U+0021 U+0060   <>      U+00A1  ; !` -> inverted exclam
U+003F U+0060   <>      U+00BF  ; ?` -> inverted question

; additions supported in T1 encoding
U+002C U+002C   <>      U+201E  ; ,, -> DOUBLE LOW-9 QUOTATION MARK
U+003C U+003C   <>      U+00AB  ; << -> LEFT POINTING GUILLEMET
U+003E U+003E   <>      U+00BB  ; >> -> RIGHT POINTING GUILLEMET

机制类似:例如,组合U+0060 U+0060转变为U+201C

LuaTeX 使用另一种不同的方法。

答案3

正如 Herbert 所暗示的,这是使用连字符完成的,因此确实是由字体完成的,而不是以 (La)TeX 宏定义的形式。我同意使用lmodern包括字体编码。

此外,我还想指出这个不错的csquotes软件包,它提供了很多引用功能,例如\enquote{<text>}。它支持不同的语言及其引用样式!特别是在我的软件包文档中,我喜欢使用反引号来表示特殊的逐字模式,因此这种宏非常受欢迎。但是,它似乎无法确保所用字体的引号正确,因此仍然需要手动加载正确的引号,正如 Herbert 所展示的那样。

答案4

引号和 en 或 em 破折号使用与连字符相同的机制。也就是说,字体定义了要用特定字形替换的某些输入字符组合。例如,这是来自 METAFONT来源原始 Computer Modern 字体:

可连接“`”:“`”=:oct“134”;
可连接“'”:“'”=:oct“042”,“?”字距2u#, "!"字距 2u#;

也就是说,如果字体没有为 定义连字'',则不会替换字符。在相同的 Computer Modern 源中,我们可以验证字体cmttligs:=0,这会跳过连字生成。Herbert 已经表明,相比之下,Latin Modern 的等宽字体支持这些连字。

还应注意,这种特殊约定主要出现在 TeX 相关字体中。许多 TrueType 或 OpenType 字体不会包含这些连字符。支持此类字体的引擎将实现自己的解决方案以保留该功能。例如,请参阅XeTeX 常见问题解答关于这个话题。

相关内容