使用 LuaLaTeX 的带有 fontspec 的 MLModern

使用 LuaLaTeX 的带有 fontspec 的 MLModern

我想用 MLModern 的字体(衬线字体、无衬线字体、电传打字机字体等)排版一份文档,然后将电传打字机字体更改为我提供其 TTF 的其他自定义字体(Iosevka,在下面的示例中)。这是我使用 fontspec 进行此操作的尝试,使用 LuaLaTex 进行编译:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{fontspec}
\usepackage{mlmodern}

\begin{document}
%\setmainfont{MLModern}
This should be in MLModern's roman font.

\texttt{This should be in MLModern's teletype font.}

\setmonofont{iosevka.ttf}
\texttt{This should be in Iosevka.}
\end{document}

加载mlmodern包后,我以为默认字体是 MLModern,但第一行似乎是 Latin Modern。奇怪的是,第二行也是罗马字体,而不是电传打字字体。(第三行没问题。)

如果我尝试使用上面注释掉的行将主字体设置为 MLModern,则编译不会成功:

This is LuaHBTeX, Version 1.13.2 (TeX Live 2021/Arch Linux) 
 restricted system commands enabled.
(./main.tex
LaTeX2e <2021-11-15> patch level 1
 L3 programming layer <2021-11-22>
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2021/10/04 v1.4n Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texmf-dist/tex/latex/base/fontenc.sty
(/usr/share/texmf-dist/tex/latex/lm/t1lmr.fd))
(/usr/share/texmf-dist/tex/latex/fontspec/fontspec.sty
(/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
(/usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty
(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-luatex.def)))
(/usr/share/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty
(/usr/share/texmf-dist/tex/latex/base/fontenc.sty)
(/usr/share/texmf-dist/tex/latex/fontspec/fontspec.cfg)))
(/usr/share/texmf-dist/tex/latex/mlmodern/mlmodern.sty)

LaTeX Font Warning: Font shape `TU/mlmr/m/n' undefined
(Font)              using `TU/lmr/m/n' instead on input line 7.

(./main.aux) (/usr/share/texmf-dist/tex/latex/base/ts1cmr.fd)
luaotfload | db : Reload initiated (formats: otf,ttf,ttc); reason: Font "MLModern" not found.

我尝试过的其他名称是mlmodernmlm,结果相同。那么我该如何将主字体设置为 MLModern?

答案1

(编辑 1:在这个答案的早期版本中,我说使用“OT1”作为 fontenc 的选项;我现在认为您可以使用 T1 或 OT1;您只需要按正确的顺序放置包...)

显然,您需要按照特定的顺序加载包。

以下对我有用(– 我现在没有安装 Iosevka 因此我用 Cousine 代替了 –):

\documentclass{article}

\usepackage{fontspec}
\usepackage[T1]{fontenc}
\usepackage{mlmodern}

\begin{document}
This should be in MLModern's roman font.

\texttt{This should be in MLModern's teletype font.}

\setmonofont{Cousine}
\texttt{This should be in Cousine.}
\end{document}

fontspec需要先走。

(显然,使用 lualatex 根本就没有必要加载 fontenc:看这里,但实际上在这种情况下,它似乎有帮助,因为否则它会首先寻找 TU 编码字体。)

编辑 2:我通过反复试验得出了这个答案,而不是对最佳实践有深入的了解。出于 Ulrike Fischer 在该答案的评论中提到的原因,这可能不是一个好主意。您可能会遇到问题。

我没有发现连字符有任何问题,但你可能会发现。

对于非 ASCII 字符,有些命令有效,有些则无效,但在我的测试中,生成非 ASCII 字符的 ASCII LaTeX 命令通常有效。例如,ß直接插入无效,但\ss可以;直接使用无效,但\ldots可以,等等。这显然有多大的问题取决于您的用例。但我发现,即使使用非 ASCII 字符,也可以加载新unicode字符打包并发出如下命令:

\usepackage{newunicodechar}
\newunicodechar{ß}{\ss}
\newunicodechar{…}{\ldots}
\newunicodechar{—}{---}
% and so on

这样我就可以在源代码中使用非 ASCII 字符。但我对此的测试并不详尽,因此请谨慎使用此答案。

相关内容