一个可能会给你带来影响的例子

一个可能会给你带来影响的例子

根据luatex 文档,你不应该fontenc和 luatex 一起使用。人们发誓向上向下fontenc 不兼容,但我找不到加载该包导致问题的示例。(我对此很好奇,因为加载 pdftex/luatex/xetex 的相同基本包集会更容易,并且fontspec仅在处理后两者时添加。)

我知道fontenc这不是在 luatex 或 xelatex 中处理字体的正确方法,但我专门在寻找有害的加载 fontenc 包。你知道吗?

答案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.deflgrenc.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 版本,这是合法的,因为 Adob​​e 多年前发布了一个免费且可修改的版本。在这里,我加载通用语

\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输出而正确产生。T1lualatex30řpdflatex30°

相关内容