当我输入``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 源中,我们可以验证字体cmtt
集ligs:=0
,这会跳过连字生成。Herbert 已经表明,相比之下,Latin Modern 的等宽字体支持这些连字。
还应注意,这种特殊约定主要出现在 TeX 相关字体中。许多 TrueType 或 OpenType 字体不会包含这些连字符。支持此类字体的引擎将实现自己的解决方案以保留该功能。例如,请参阅XeTeX 常见问题解答关于这个话题。