许多符号似乎通常通过连字机制调用。(如果我错了,请纠正我。)让我们看一下编码/字体中通常存在哪些连字符:
- 真正的连字(用于字母):
ff
(ff
)fi
(fi
)fl
(fl
)ffi
(ffi
)ffl
(ffl
) - 连字机制的其他用途(用于符号):(
``
)“
()''
()()()()()()()”
,,
„
--
–
---
—
!`
¡
?`
¿
<<
«
>>
»
(这些似乎是T1
;对于OT1
减法,,
和<<
/来说很重要的>>
。还有其他罕见的连字符,我不想对此进行详尽的研究。请随意添加信息。我不确定这是否更多的是编码或字体的事情。)
我不知道这种“默认”连字符的规范性。它们在多大程度上是规范性的?这些惯例在哪里固定下来?哪些连字符约定可以安全地依赖(如果有的话)?例如,是否有理由在包代码中始终使用, \textquotedblleft
, \textquotedblright
* \glqq
, \textendash
, \textemdash
, \textexclamdown
, \textquestiondown
,而不是连字符字母序列?\guillemotleft
\guillemotright
[* 不确定\glqq
开箱后在哪里可以使用]
答案1
简单的答案
因此假设你通过 (pdf)LaTeX 运行此代码:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\begin{document}
`` (“) '' (”) ,, („) -- (–) --- (—) !` (¡) ?` (¿) << («) >> (»)
\textquotedblleft \textquotedblright \textendash \textemdash \textexclamdown \textquestiondown \guillemotleft \guillemotright
\end{document}
fontenc
将加载t1enc.def
包含以下定义:
\DeclareTextSymbol{\textquotedblleft}{T1}{16}
\DeclareTextSymbol{\textquotedblright}{T1}{17}
\DeclareTextSymbol{\textendash}{T1}{21}
\DeclareTextSymbol{\textemdash}{T1}{22}
\DeclareTextSymbol{\textexclamdown}{T1}{189}
\DeclareTextSymbol{\textquestiondown}{T1}{190}
\DeclareTextSymbol{\guillemotleft}{T1}{19}
\DeclareTextSymbol{\guillemotright}{T1}{20}
据我了解,这意味着即使字体未设置为支持标准 T1 连字符,您也会获得正确的字符。前提是,正确的字形位于正确的位置。因此,如果字体出于某种原因以不同的方式偏离了 T1 设置的标准 - 它将 ¡ 放在错误的位置,但将标准连字符设置为指向该(错误的)位置 - 那么您将获得错误的字符,而连字符会让您获得正确的字符。
这两种情况都不太可能发生,因为您通过 (pdf)LaTeX 使用的任何字体都是为 TeX 设置的。因此,只有当有人引入错误时,才会出错。首先,大多数人会将所涉及的大部分工作自动化,而且工具通常很可靠。其次,类似这样的问题会被报告为错误并(希望)得到修复。
编码是标准化的,字体包通常也很可靠。因此命令和连字符都是可靠的。虽然两者都不能保证,但我认为两者不会比另一个更容易出错。
并发症
有时需要“调整”或自定义字体编码(如 T1)。例如,我可能会调整特定字体的编码以容纳其他字符或连字符。现在事情变得复杂了。为了做到这一点,我必须使用 T1 分配给其他内容的插槽。可以想象,有人可能会将通常用于上述字符之一的插槽用于其他内容,然后删除指向该插槽的连字符命令。这样做的唯一好理由是字体不提供字形,并且无法从字体中的其他字形构建。在这种情况下,如果您可以使用该插槽,您可能会这样做。现在您可能会认为在这种情况下,您还应该重新定义相关命令\text...
。但是,如果您这样做,您将覆盖其他 T1 编码字体的命令。所以你不应该。你只需在文档中标记它。但请注意,在这种情况下,无论如何事情都会出错 - 因为字体不提供字形,所以连字和命令都肯定会给出错误的输出。你什么也做不了。至少,你没有什么非常简单的方法可以做,也没有什么令人满意的方法。
但几乎所有字体都提供特定的字符,因此这在很大程度上是假设的。例外是专业字体,例如装饰字体,其字符集可能非常有限。但是,如果您正在使用这些字体,您可能知道这一点。
一般来说,获得预期的输出是复杂的。这取决于主动编码和字体。对于 (pdf)LaTeX,除了 或 truetype 字体本身之外,它还取决于.tfm
文件,也许还取决于。根据字体包的不同,将涉及多种编码。例如,您可能使用完全不同的编码指向原始字体中的插槽,同时使用 T1 或自定义 T1 在最终用户级别定义字体编码。虚拟字体可以组合来自不同字体的字符,通过告诉 TeX 如何从其他字形构建它们来指定“假”字形,等等。例如,如果字体不提供连字(对于提供小型大写字母的专业字体来说并不少见),您可以使用包含从字形构建连字的说明的虚拟字体。.vf
.pfb
ff
ff
f
当人们指出输入和输出编码之间的差异时,他们忽略了其中涉及的真正复杂性。在许多情况下,还涉及其他编码。