我的解决方案很不好看,我会在下面提到它,但首先了解为什么会发生这种情况很重要。
为什么会发生这种情况
间接生成的中间.tex
文件调用了Latin Modern字体。Latin Modern是数学字体的良好选择,但对于等宽字体来说并不理想。Latin Modern等宽字体不包含希腊字母。
Latin Modern是由unicode-math LaTeX包设置的,该包在生成的LaTeX中大约在第43行加载。
\ifPDFTeX
\usepackage[T1]{fontenc}
\IfFileExists{alphabeta.sty}{
\usepackage{alphabeta}
}{
\usepackage[mathletters]{ucs}
\usepackage[utf8x]{inputenc}
}
\else
\usepackage{fontspec}
\usepackage{unicode-math}
\fi
因此,如果您使用XeLaTeX(这是一个很好的默认选择)或LuaTeX或任何其他可用fontspec
的LaTeX引擎,则将加载unicode-math
包。
在数学方面,unicode-math包非常合理地使用Latin Modern,但如果未设置其他内容,则它还将使用Latin Modern来进行等宽字体。从文档中可以看到:
加载了该包后,就不再支持传统的基于TFM的数学字体。您只能使用\setmathfont命令切换到其他OpenType数学字体。如果在\begin{document}之前不加载OpenType数学字体,则会自动加载Latin Modern Math。
unicode-math
的创建者假定您在加载unicode-math
之后设置非数学字体,但这在通过jupyter nbconvert
生成的.tex
中并没有做到。(我不知道这是jupyter的问题还是Pandoc的问题,但无论哪种方式,我们最终得到了一个除数学外大多数都使用Latin Modern的文档。)
因此,一种解决方案是在加载unicode-math后并在\begin{Document}
之前设置其他某种等宽字体。
我的解决方案
我的解决方案是针对我已经设置好的内容进行调整的。它可能不适合您,肯定需要一些调整。
我的 Makefile 以前只有一个简单的 juypter nbconvert --to=pdf
。但现在我需要编辑中间的 .tex
文件。所以我为一个名为 computation-examples
的笔记本电脑设置了这个。您需要使用自己的文件名或进行一些 Make 规则操作。
computation-examples.tex: computation-examples.ipynb
jupyter nbconvert --to=latex $<
perl -pi -e '/^([ \t]*)\\usepackage{unicode-math}/ and $$_.="$$1\\usepackage[default]{fontsetup}\n"' $@
Perl会在
\usepackage{unicode-math}
这一行后面立即添加
\usepackage[default]{fontsetup}
。可能有更好的方法来实现这个功能,我一开始尝试使用sed,但最终放弃了。因此,由XeLaTeX处理的
.tex
文件将包含这些内容并生成PDF文件。
\else
\usepackage{fontspec}
\usepackage{unicode-math}
\usepackage[default]{fontsetup}
\fi
fontsetup
包在设置非数学字体的同时保留了unicode-math
的所有优点。默认情况下,使用OpenType(.otf
)Computer Modern Unicode字体,这些字体将成为任何具有xelatex的TeX发行版的一部分。
另一种方法
可能是一种更清晰的方法,但我还没有尝试过,那就是创建一个fontspec.cfg文件,它会欺骗(覆盖)我们所谓的Latin Modern Mono要加载哪些字体文件。我需要再次阅读fontspec文档才能做到这一点。
创造魔法
自从写了上面的内容以来,我已经设置了一个更通用的Makefile规则,
%.tex: %.ipynb
jupyter nbconvert --to=latex $<
perl -pi -e '/^([ \t]*)\\usepackage{unicode-math}/ and $$_.="$$1\\usepackage[default]{fontsetup}\n"' $@
这个程序需要依据一些规则从.tex
文件生成PDF文档。
但是如果你不使用make和Makefile,那么你可以将那个Perl脚本封装到你选择的脚本中。
$\lambda$
这种符号来规避这个问题,幸运的是它对我起作用了。因此,简而言之,不要使用Unicode字母,而是依靠LaTeX语法来生成希腊字母。 - Timeless