这段 org babel latex 代码明明是错的, 为什么没有报语法错误?

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

这段代码我放到 .tex 文件没法过编的, 倒数第 3 行最右边多了一个 }, 但还是没有报错, 居然还正确生成了 svg, 这是怎么回事?

因为 TeX 有一个 nonstopmode,可以在遇到一定错误时也能完成编译。如果只是在最后多了或者少了个括号这种 TeX 自己就能猜到怎么处理的简单问题那么就算输出结果是完整的也不奇怪

2 个赞

的确如楼上所说, 是 nonstopmode 的问题, 不过吐槽一下, babel latex 对于 png, svg, pdf 竟然 preamble 和 compile process 各不一样. 对于 png 要设置的是 org-preview-latex-process-alist, svg 和 pdf 一样, 设置 org-latex-pdf-process. 我的做法是去掉 org-latex-pdf-process 中 nonstopmode 选项, babel 中哪怕要生成 png, 也先用 pdf 格式检查一下语法, 因为不想修改 org-preview-latex-process-alist.