奇怪的事: org latex babel file 如果为 svg, 会用 inkscape 进行转换(并且错误), file 为 png, 会用 dvisvgm 得到 svg

#+header: :headers '("\\usepackage[ruled, linesnumbered]{algorithm2e}")
#+begin_src latex :results file raw :file Pasted_image_20240226092108.png
\setcounter{algocf}{0}
\begin{algorithm}
\DontPrintSemicolon
\SetKwFunction{VecAddMod}{VecAddMod}
\KwIn{\(\mathbf{\text{ct}}_{0}=(\mathbf{a_{0}}, \mathbf{b_{0}})\), \(\mathbf{p}\)}
\KwOut{output}
output $\leftarrow$ \VecAddMod{\(\mathbf{a_{0}}, \mathbf{p}\)}, \VecAddMod{\(\mathbf{b_{0}}, \mathbf{p}\)} \;
\caption{PAdd}
\end{algorithm}
#+end_src

#+RESULTS:
[[file:Pasted_image_20240226092108.png]]

这段代码我输出文件格式是 .png, 但用 less 查看发现其实是 svg 格式, 并且是用 dvisvgm 生成的. 而如果我写为 Pasted_image_20240226092108.svg, 反而会用 inkscape 将 pdf 转换为 svg, 而且转换错误.

确实,我也遇到了这个问题

这是因为 ob-latex 在生成 png 格式的图片时会使用没有提供 PROCESSING-TYPE 参数的 org-create-formula-image 来生成,此时使用的是变量 org-preview-latex-default-process 中的程序,楼主的设置应该是 dvisvgm

对于 svg 格式的图片,ob-latex 默认用的是 standalone (org-babel-latex-preamble),与 algorithm 不兼容,详见 algorithms - standalone document with algorithm2e package - TeX - LaTeX Stack Exchange

可以参考链接里的方法,另外楼主少了 amsmath 。

(setq org-babel-latex-preamble (lambda (_)
                                 "\\documentclass{standalone}"))
#+header: :headers '("\\usepackage{amsmath}" "\\usepackage[ruled, linesnumbered]{algorithm2e}")
#+begin_src latex :results file raw :file Pasted_image_20240226092108.svg
\setcounter{algocf}{0}
\begin{algorithm}[H]
\SetKwFunction{VecAddMod}{VecAddMod}
\KwIn{\(\mathbf{\text{ct}}_{0}=(\mathbf{a_{0}}, \mathbf{b_{0}})\), \(\mathbf{p}\)}
\KwOut{output}
output $\leftarrow$ \VecAddMod{\(\mathbf{a_{0}}, \mathbf{p}\)}, \VecAddMod{\(\mathbf{b_{0}}, \mathbf{p}\)} \;
\caption{PAdd}
\end{algorithm}
#+end_src

1 个赞

谢谢详细的解释! 我理解了 svg 为啥会显示出错, 不过就算解决了这个问题, 它还是会用 inkscape 将 pdf 转换为 svg, 我觉得还不如直接用 dvisvgm, 我修改一下 org-babel-execute:latex, 让它逻辑和 png 一致.

我到生成 pdf 这一步成功了,但是转换 PDF 为 svg 失败了。看提示信息,他即在 org 文件同目录下创建了一些 tex 文件以及 pdf,又在 /var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-181p1j 下创建了同样的 tex 文件,但是这个路径下面没有 pdf 文件,导致 inkscape 无法打开 pdf 转换成 svg,不知道问题出在哪里。。。

用 dvisvgm 转 pdf 有时候会有问题,比如说和 Ghostscript 版本兼容问题等。

1 个赞

我好像遇到过类似的问题, 我当时是 org-latex-pdf-process 写错了, 生成的 .pdf 没有生成到与 tex 文件同一目录下.

我的是这样的

   org-latex-pdf-process '("latexmk -xelatex -quiet -shell-escape -f %f")

这不没指定目录嘛,加上 -output-directory=%o 应该就好了。

修改过后的确生成的 pdf 在路径 /var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/ 内了,完整路径是 /var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-ZOyj5C.pdf

org-latex-pdf-process 设置是这样。

org-latex-pdf-process '("latexmk -xelatex -quiet -shell-escape -f -output-directory=%o %f")

但是 log 中依旧是提示找不到。。。

(org.inkscape.Inkscape:83923): WARNING **: 17:30:47.484: Can't open file: /var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-ZOyj5C.pdf (doesn't exist)
ink_file_open: '/var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-ZOyj5C.pdf' cannot be opened!
InkscapeApplication::document_open: Failed to open: /var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-ZOyj5C.pdf
ConcreteInkscapeApplication::on_open: failed to create document!
2024-03-07 17:30:47.489 inkscape[83923:993279] WARNING: Secure coding is not enabled for restorable state! Enable secure coding by implementing NSApplicationDelegate.applicationSupportsSecureRestorableState: and returning YES.
org-compile-file: File "/var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-ZOyj5C.svg" wasn’t produced  org babel latex failed
PDF file produced.
Executing Latex code block at position 598...
Processing LaTeX file /var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-AoCfdS.tex...
Compiling /var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-AoCfdS.tex...
org-compile-file: File "/var/folders/_2/mxhz9mf51tl1070cd5ykx69c0000gn/T/babel-8PzZX6/latex-AoCfdS.svg" wasn’t produced  org babel latex failed
PDF file produced.

这感觉是另外的问题,你要不重开一个帖子,发个最小可复现配置?

好像是 WARNING: Secure coding is not enabled for restorable state! Enable secure coding by implementing NSApplicationDelegate.applicationSupportsSecureRestorableState: and returning YES. 的问题,我先搜了看看。感谢耐心解答。

发了新帖子,用 use-package 也是可以复现的(原来我用的 setup) org latex babel 执行后已实际生成的 PDF,但inkscape 找不到。