何时应将 fontenc 包与 pdflatex 一起使用?

何时应将 fontenc 包与 pdflatex 一起使用?

我一直在使用 fontenc 包进行以下调用,主要是因为我读到这里。

\usepackage[T1]{fontenc}

但我注意到,当我这样做时,我会丢失 libertine 包中的一些连字符。例如,使用以下代码,我会得到一些连字符(也许更多?):

\documentclass{article}
\usepackage{libertine}
\begin{document}
fi ff fl ffl ffi fj Th Qu
\end{document}

输出如下所示:

在此处输入图片描述

但如果我像这样添加 fontenc:

\documentclass{article}
\usepackage{libertine}
\usepackage[T1]{fontenc}
\begin{document}
fi ff fl ffl ffi fj Th Qu
\end{document}

我丢失了 fj、Th 和 Qu 连字符:

在此处输入图片描述

所以我猜 fontenc 不应该加载 libertine。对吗?如果对,有没有关于何时使用它的指导原则?

(我已经忘记了如何添加高质量的示例图像。如果有说明链接就更好了。)

答案1

这个问题没有简单的答案。或者说,你已经知道简单的答案了。一般来说,我建议

\usepackage[T1]{fontenc}

除非你知道你需要一些不同的东西。一般来说,这将产生良好的结果,在大多数情况下会比其他选择更好。

这是因为 T1 编码将为您提供默认 OT1 编码所能提供的一切,以及各种预制重音字符和各种西欧语言所需的一些额外字符。同时,英语至少会和 OT1 一样好,甚至可能更好。

但是,在创建字体支持包时可以更改编码,这样 T1 编码或 OT1 编码或其他编码就与官方编码不太一样了。这只适用于某些类型的字符。最值得注意的是,它适用于连字。

这意味着可以将额外的连字符添加到编码中原本为空的位置,或将其替换到原本用于其他字符的位置(也许是字体不包含的字符)。

结果是

\usepackage[<encoding>]{fontenc}

可能不能准确获取<encoding>。它可能会获取破解版的<encoding>

软件包的字体支持文件libertine是使用autoinst脚本生成的,该脚本可以配置为利用编码中的空槽来容纳额外的连字。当以这种方式准备字体时,槽不会重新分配给连字,但如果编码有空槽,这些槽可用于编码通常支持的连字以外的连字。

.map这是来自该包的文件片段的映射行

LinLibertineT-tlf-ot1--base LinLibertineT "AutoEnc_c7kyj5lv7lwhdgytk3lalexyxf ReEncodeFont" <[lbtn_c7kyj5.enc <LinLibertineT.pfb

lbtn_c7kyj5.enc是该线路使用的编码文件。当我们检查此文件时,我们发现

%00
  /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon
  /Phi /Psi /Omega /.notdef /.notdef /.notdef /.notdef /.notdef

%80
  /f_i /f_f_i /f_f /f_l /f_f_l /f_b /f_h /f_j
  /f_k /f_t /t_t /Q_u /T_h /f_f_h /f_f_j /f_f_k
%90
  /f_f_t /exclamdbl /question_question /question_exclam /exclam_question /ellipsis /.notdef /.notdef
  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef

相比之下,这里是7t.enc与标准 OT1 编码相对应的相应部分:

%00
  /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon
  /Phi /Psi /Omega /ff /fi /fl /ffi /ffl

%80
  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
%90
  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef

这显然不是标准的OT1编码。

这里,autoinst在编码中使用了超过 128 个槽。也就是说,它本质上将编码视为 8 位(256 个槽)而不是 7 位(128 个槽),而原始 TeX 编码都是 7 位(128 个槽),包括 OT1。

但是,T1 编码已经是 8 位编码(256 个槽位)。而且,它没有一个备用槽位。因此,autoinst无法将额外的连字符分配给备用槽位,因为没有备用槽位。

相比之下,LY1 编码是一种带有一些备用槽的 8 位编码。在这种情况下,autoinst将额外的连字符分配给备用槽,直到用尽所有槽。这意味着它使用了一些额外的连字符,但不是全部。特别是,fj连字符适用于此编码,而ThQu连字符则不适用。

LY1

这里唯一真正的答案是,您应该选择最适合您需求的编码。这取决于文档的内容,在某些特殊情况下,还取决于您加载的字体所使用的破解编码的具体情况。

答案2

根据大卫的建议,我会将我的评论转化为答案。

首先:上述关于字体编码和修改的答案确实有效。几年前,我手动修改了 LY1 编码,以便它能够容纳“Th”连字符,并且还使用 Adob​​e Garamond Pro 字体引入了另一种形式的破折号。效果很好,但很乏味。

更现代的方法是忘记fontencOT1。切换到 LuaTeX。大多数适用于普通 pdfLaTeX 的软件包也可以直接使用 LuaTeX,无需任何特殊操作。

借助 LuaTeX 和所有采用 utf-8 编码的文本,该fontspec软件包可直接处理 TrueType 和 Open Type 字体。如果所需连字是字体的“liga”(标准连字)功能集的一部分,则会自动启用它们。如果它们是“自由”连字(dlig 功能),则很容易请求它们。

您不需要了解任何有关 LuaTeX 或 Lua 语言的知识。繁重的工作在后台完成。查看fontspec软件包文档,了解它能做什么。如果您进行测试运行,请务必指定您想要 TeX 连字(在 中描述fontspec),以便您之前的文本输入兼容。

一旦我发现了这一点,我就再也不会回到 LuaTeX 之前的方法了。

也适用于 XeTeX(但我碰巧需要 XeTeX 无法做到的事情)。

编辑:添加了 MWE

% !TeX program = LuaLaTeX
% !TeX encoding = UTF-8
\documentclass{article}
\RequirePackage{fontspec}
\title{MWE}
\setmainfont{Adobe Garamond Pro}
\begin{document}
“This is a baffling fjord,” said Sven.
\end{document}

结果:请注意,有连字符 Th ffl 和 fj。还请注意,文档中输入了普通的花括号,因为它可以理解 utf-8。如果您尝试使用 libertine,请务必请求“Linux Libertine O”(请参阅​​大写 O)作为字体。

代码结果

答案3

所以我猜 fontenc 不应该加载 libertine。对吗?

可能,也可能不是,这取决于要求。miktex 和 texlive 中配置的 pdftex 格式仅加载了用于 T1 编码的连字模式,因此如果您使用 OT1 编码字体,则连字只有在 OT1 和 T1 一致时才是正确的,这实际上意味着除非您使用的语言(例如英语)不使用重音字母,否则它将是不正确的。

如果您用英语书写,并且想要额外的连字符,那么使用 OT1 是相当合理的,在其他语言中,失去正确的连字符可能会为连字符付出太高的代价,也许您需要研究具有自定义编码的更复杂的设置。

相关内容