Jupyter的PDF输出无法显示Unicode字符(比如λ)

4
我正在使用Julia在Jupyter笔记本中。我想为我的工作结果生成PDF。但是,在生成PDF时,数学表达式λ=3中的λ会丢失,因此PDF输出为=3
以下是Jupyter笔记本代码。
In[1]: λ=3 
Out[1]: 3

这是使用Jupyter Notebook生成的PDF文档。
In[1]: =3 
Out[1]: 3

这并不适用于使用 nteract 生成的pdf,在其中表达式λ=3被完全打印出。但是与使用jupyter notebook生成的pdf相比,nteract生成的pdf的整体外观不如人意。
以下是使用nteract生成的打印出来的pdf(与代码本身完全相同):
In[1]: λ=3
Out[1]: 3

有人知道如何在jupyter notebook中打印这样的字符吗?
提前致谢。

一些最小化的代码以便重现问题会很有帮助。 - Jongware
我尝试了被接受的答案,但不幸的是对我没有起作用。然后我找到了一种方法,通过使用 $\lambda$ 这种符号来规避这个问题,幸运的是它对我起作用了。因此,简而言之,不要使用Unicode字母,而是依靠LaTeX语法来生成希腊字母。 - Timeless
2个回答

5
这个问题与Jupyter本身如何生成和编译latex文件有关。默认情况下,Jupyter使用xelatex编译文件以支持Unicode。我猜想,xelatex需要在文件中进行一些配置,而Jupyter生成的文件无法直接使用xelatex命令编译。
您可以更改Jupyter的配置,以便使用pdflatexlatex命令编译生成的latex文件。
解决方法: 找到您的Jupyter配置目录(例如jupyter --config-dir的输出,在Linux上通常为~/.jupyter。要找出IJulia使用哪个Jupyter,请运行using IJulia; IJulia.jupyter然后找出该Jupyter的配置目录)。
如果没有此文件,请在此目录中创建jupyter_notebook_config.py文件。
将以下代码行放在文件末尾并保存:
c.PDFExporter.latex_command = ['pdflatex', '{filename}']

然后您可以按照通常的方法使用笔记本导出PDF文件,字符应该显示正确。只要在您的shell中找到pdflatex命令,这应该能够正常工作。

如果您没有pdflatex但有latex,您可以使用以下行代替上面的代码:

c.PDFExporter.latex_command = ['latex', '--output-format=pdf', '{filename}']

如果您无法更改Jupyter的配置,请下载latex文件并使用命令latex --output-format=pdf filename.tex进行编译。祝愿它能够成功!

很遗憾,这对我没有起作用,我收到了类似“!Package ucs Error: Unknown Unicode character 12479 = U+30BF”的错误。 - minexew
pdflatex,{文件名} - minexew
问题可能与您的Latex发行版有关。您可以尝试使用笔记本的Latex副本(下载为*.tex)并使用pdflatex - hckr

0

我的解决方案很不好看,我会在下面提到它,但首先了解为什么会发生这种情况很重要。

为什么会发生这种情况

间接生成的中间.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 规则操作。

# sed on macOS is just weird. Resorting to perl
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脚本封装到你选择的脚本中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接