spacemacs org中得latex fragment里面输入中文preview并不正确

这个东西我总算彻底搞懂了,最坑的地方是他报错只有一种错误信息,让你误以为总是dvi输出出错.

实际上这里的错误是很多方面的,你需要自己运行这段指令的每一个环节逐个排除各种错误.

由于我装的是texlive套件,其他人遇到的和程序对接不上导致的错误我没遇到过.

但我至少遇到了以下四种错误

  • 1pdflatex不兼容中文出错
  • 2中文字体找不到出错
  • 3dvipng不兼容xelatex的xdv出错
  • 4imagemagick 安全策略出错

如果你在linux上成功编译过latex文档,那么上面的1和2错误就不会犯,但是3和4还是可能会错.

下面我来全面讲一讲他们为什么错.

首先肯定不能用原本的pdflatex编译器,因为他不支持中文字符,会报错 所以要用xelatex.

但是你用了xelatex,编译器又不会找中文字体,需要你手动给它指定你想要渲染的中文字体.

所以你需要给模板最终生成的tex文件里加上两句代码

\usepackage{fontspec}
\setmainfont{Noto Serif CJK SC}

setmainfont中的参数是你系统中存在的中文字体.

其他的ctex,xeCJK都不需要,只要这两条,加多了影响运行速度,特别是ctex.

把他们加到最终tex里的方案也有两种

一种是永久的

  • 先从org-mode给的API加\usepackage{fontspec}
(setq org-latex-packages-alist
             '(("" "fontspec" t)))
  • 再从模板文件fullpage.sty里追加一行
\setmainfont{Noto Serif CJK SC}

另一种是临时的,

  • 把代码直接加到org文件头部
#+LaTeX_HEADER: \usepackage{fontspec}
#+LaTeX_HEADER: \setmainfont{Noto Serif CJK SC}

加了上面的内容后,再用上面的人写的

  (setq org-preview-latex-default-process 'dvisvgm)
  (setq org-preview-latex-process-alist
        '((dvisvgm :programs
                   ("xelatex" "dvisvgm")
                   :description "xdv > svg" :message "you need to install the programs: xelatex and dvisvgm." :use-xcolor t :image-input-type "xdv" :image-output-type "svg" :image-size-adjust
                   (1.7 . 1.5)
                   :latex-compiler
                   ("xelatex -no-pdf -interaction nonstopmode -output-directory %o %f")
                   :image-converter
                   ("dvisvgm %f -n -b min -c %S -o %O"))
          (imagemagick :programs
                       ("xelatex" "convert")
                       :description "pdf > png" :message "you need to install the programs: xelatex and imagemagick." :use-xcolor t :image-input-type "pdf" :image-output-type "png" :image-size-adjust
                       (1.0 . 1.0)
                       :latex-compiler
                       ("xelatex -interaction nonstopmode -output-directory %o %f")
                       :image-converter
                       ("convert -density %D -trim -antialias %f -quality 100 %O"))))

就可以了.

如果你想在latex fragment里用中文,只能用这一种由xelatex->dvisvgm 的 dvi>svg的模式

其他的模式如

xelatex->dvipng,

他们的中间文件版本不兼容,会报错

还有xelatex->imagemagick

由于imagemagick的安全策略禁止了ghostscript执行,也会导出png不成功而报错.

所以你只能用这一种.

1 个赞