答案1
fontenc
已加载fontspec
(您可以在日志中查看)。因此,该包本身没有问题。
但是 fontenc 是一个特殊的包:你可以用不同的选项多次加载它,而不会出现选项冲突错误。然后它将加载所有选项的字体编码定义。例如
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[LGR]{fontenc}
\usepackage[T2A]{fontenc}
\begin{document}
\encodingdefault, \makeatletter \f@encoding\makeatother
\end{document}
将加载t1enc.def
,lgrenc.def
并且t2enc.def
。
对于 lualatex 和 xelatex 来说这也不是问题。
但 fontenc 还将设置最后的encoding 选项作为编码默认值。而且相当多的编码不适用于 lualatex 和 xelatex。这些引擎需要编码TU
(fontspec 设置此编码)。其他编码可能会导致相当错误的输出:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[LGR]{fontenc}
\usepackage[T2A]{fontenc}
\usepackage{fontspec}
\setmainfont{DejaVuSans}
\begin{document}
\encodingdefault, \makeatletter \f@encoding\makeatother
Grüße, αβγ, Ҍҋ
{\fontencoding{T1}\selectfont
Grüße, αβγ, Ҍҋ}
{\fontencoding{LGR}\selectfont
Grüße, αβγ, Ҍҋ}
{\fontencoding{T2A}\selectfont
Grüße, αβγ, Ҍҋ}
\end{document}
因此您可以fontenc
在文档中使用(我需要它来使用chessfonts
),但您应该小心地加载它,以便 TU 保持默认编码。例如,这里是错误的:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{DejaVuSans}
\usepackage[T1]{fontenc}
\usepackage[LGR]{fontenc}
\usepackage[T2A]{fontenc}
%
\begin{document}% wrong, encoding is T2A
移动\setmainfont
解决了该问题:
\documentclass{article}
\usepackage{fontspec}
\usepackage[T1]{fontenc}
\usepackage[LGR]{fontenc}
\usepackage[T2A]{fontenc}
\setmainfont{DejaVuSans}
\begin{document} %encoding is TU now
答案2
一个可能会给你带来影响的例子
fontspec
如果同时加载这两种编码,则可能会出现问题fontenc
。更准确地说,正如 David Carlisle 指出的那样,如果您在同一文档中将 Unicode 与其他编码组合在一起,则可能会发生这种情况,而您却没有意识到自己同时加载了这两种编码,甚至在之前可以正常工作的文档中也是如此。下面是一个示例,它加载了传统的 Utopia 字体(T1 编码),但随后还尝试通过 Babel 加载现代 Unicode 字体。
\documentclass[varwidth, preview]{standalone}
\usepackage[spanish]{babel}
% Due to a bug in Babel 3.22, we must override the OpenType
% language and script features for Japanese, and several other
% languages.
\babelprovide[language=Japanese, script=Kana]{japanese}
% Implicitly causes babel to load fontspec:
\babelfont[japanese]{rm}{Noto Sans CJK JP}
% Implicitly loads fontenc with [T1]:
\usepackage[poorman]{fourier}
\begin{document}
¿Es \foreignlanguage{japanese}{日本} Utopía?
\end{document}
改变加载软件包的顺序可能会带来许多不同的错误。本例中的几个问题之一是fontspec
使所有非 ASCII 字符无效,从而阻止它们被正确地转换为其他编码。如果您重新排序命令以便\setbabelfont
在 之后加载fourier
,则您会将主字体设置为 Latin Modern Roman。
我的帖子的其余部分是关于如何使那个损坏的示例发挥作用,因此,如果您只关心某些损坏的示例fontenc
,那么您可以停止阅读。
如何结合 Unicode 和传统字体
我不会评判。有时我没资格设定要求。
为了修复这个例子,使用 load luainputenc
,尽管名字具有误导性,但它也允许在输出时在 Unicode 和传统编码之间切换:
\documentclass[varwidth, preview]{standalone}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{luainputenc} % Needed to mix NFSS and Unicode
\usepackage[spanish]{babel}
\usepackage[no-math]{fontspec}
\defaultfontfeatures{ Scale = MatchUppercase }
\newfontfamily\japanesefont{Noto Serif CJK JP}[
Language = Japanese,
Script = Kana ]
\newcommand\textjapanese[1]{{\japanesefont #1}}
\usepackage[poorman]{fourier}
\begin{document}
¿Es \textjapanese{日本} Utopía?
\end{document}
更好的解决方案
快速的网络搜索显示,Utopia 有多个免费的 OTF 版本,这是合法的,因为 Adobe 多年前发布了一个免费且可修改的版本。在这里,我加载通用语:
\documentclass[varwidth, preview]{standalone}
\usepackage{polyglossia}
\setdefaultlanguage{spanish}
\defaultfontfeatures{ Scale = MatchUppercase, Ligatures = TeX }
\setmainfont{Lingua Franca}[
Scale = 1.0 ,
Ligatures = Common ,
Numbers = OldStyle ]
\newfontfamily\japanesefont{Noto Serif CJK JP}[
Language = Japanese,
Script = Kana ]
\newcommand\textjapanese[1]{{\japanesefont #1}}
\begin{document}
¿Es \textjapanese{日本} Utopía?
\end{document}
这不太像是 hack,并且支持旧版软件包不支持的几个功能和脚本。您应该尽可能使用 Unicode,必要时使用旧版编码。
答案3
请注意,不兼容的不是加载 fontenc(fontspec 加载 fontenc),而是使用除 TU(Unicode)之外的字体编码。\fontencoding{T1}\selectfont
真正的问题也是如此,尽管最常见的激活方式是
\usepackage[T1][fontenc}
所以最简单的方法是告诉人们不要使用fontenc
。
除了其他答案中显示的错误字符外,即使您获得正确的字符,使用 xetex 和 xelatex 格式,连字也会不正确,因为只加载了 TU 连字模式。您不能将连字模式加载到普通文档中,只能在制作格式时加载。因此,设置使用 T1(或 T2 或 LGR...)编码字体获得正确连字非常棘手,语言包无法很好地支持,并且如果在未设置自定义格式的另一个站点上处理,将生成文档,这些文档会默默产生错误的结果。
luatex 的情况有所不同,它可以根据文档中的声明加载新的连字模式,但仍然很难做到正确,而且在几乎所有情况下,使用 Unicode 编码字体更简单。
答案4
我发布此文只是为了展示一个非常简单的例子,该例子fontenc
会导致一个明显的问题lualatex
:
\documentclass{article}
\usepackage[T1]{fontenc} % <- comment out
\begin{document}
30° % <- unicode degree symbol
\end{document}
使用,fontenc
输出而正确产生。T1
lualatex
30ř
pdflatex
30°