使用 emacs-jupyter,含有 python 代码块的 org-mode 文档导出为 pdf 文档没有语法高亮

装了 emacs-jupyter,用于演示数据分析过程。

(use-package jupyter
    :defer t
    :init
    (setq org-babel-default-header-args:jupyter-python '((:async . "yes")
                                                         (:session . "py"))
          org-babel-default-header-args:jupyter-R '((:async . "yes"))))

org-mode 文档中含有这样的代码块:

#+begin_src jupyter-python :kernel python3 :results scalar
d = {"key1": "value1", "key2": "value2" }
print(d)
#+end_src

导出为pdf文档后,这部分代码是没有语法高亮的,就是普通文本。

从 *Org PDF LaTeX Output* 可以查到错误信息:

! Package Listings Error: Couldn't load requested language.

应该是包 “listings” 不认识 “jupyter-python”。

那么,应该如何解决这个问题呢?

(用 vscode 做数据分析,无论过程还是导出其他格式文档都挺方便。用作演示过程,感觉还是 org-mode 更直观明了。)

试了下默认导出 tex 是:

\begin{verbatim}
d = {"key1": "value1", "key2": "value2" }
print(d)
\end{verbatim}

你应该还有什么别的配置使得用了 Listings ?

我的 texlive 是 full 安装的,在 init.el 中设置了:

  (add-to-list 'org-latex-packages-alist '("" "listings" t))

例如这样一个 org-mode 文档:

#+TITLE: 测试
#+OPTIONS: H:2 toc:nil author:nil date:nil
* Jupyter 测试
以下为一个测试。
#+begin_src jupyter-python :kernel python3
d = {“key1”: “value1”, “key2”: “value2” }
print(d)
#+end_src

导出为 tex 文档后,org-mode 文档中的 python 代码对应的 LaTeX 代码为:

\lstset{language=jupyter-python,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
d = {"key1": "value1", "key2": "value2" }
print(d)
\end{lstlisting}

生成的 pdf 文档并没有给代码加高亮。我试着把 language=jupyter-python 改为 language=python,生成的 pdf 文档依然没有给代码加高亮。

用minted可以高亮。另外需要override默认的语言,(org-babel-jupyter-override-src-block "python").

1 个赞

用你提供的这个方法有颜色了。小结一下:

使用 minted:

(setq org-latex-listings 'minted)
(add-to-list 'org-latex-packages-alist '("" "minted"))

命令 “xelatex” 需要 “-shell-escape”:

(setq org-latex-pdf-process
   '("xelatex -shell-escape -interaction nonstopmode-output-directory %o %f"
     "bibtex %b"
     "xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"
     "xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"))

在 emacs-jupyter 的设置中,override默认的语言:

在调用 “org-babel-do-load-languages” 之后

(org-babel-jupyter-override-src-block "python") 

如果用listings也是可以解决的:

;; mapping jupyter-python to Python
  (add-to-list 'org-latex-listings-langs '(jupyter-python "Python"))

1 个赞