Org-mode HTML导出

8
我有一个org文件,其中包含源代码、文档和Latex代码。 Latex部分绘制了一堆图形,以解释函数之间的相互作用。 根据http://orgmode.org/manual/LaTeX-fragments.html,使用html导出时,org-mode应将latex代码导出为图像。
#+TITLE: Test
#+AUTHOR: Blah
#+LATEX_HEADER: \usepackage{tikz}
#+OPTIONS: LaTeX:dvipng

#+begin_latex

  \begin{tikzpicture}
    \draw (1,0) -- (0,1) -- (-1,0) -- (0,-1) -- cycle;
  \end{tikzpicture}

#+end_latex

如果我使用PDF导出,上述内容可以正常工作,所以我的LaTeX设置是正确的,而且dvipng也存在于我的系统中,但是当导出到HTML时,LaTeX块完全被忽略了。


1
我想知道您对HTML导出器有什么期望。 - kindahero
2
@kindahero,我当然不指望它能为我冲杯咖啡,但我希望它能使用dvipng渲染图形并将其嵌入到HTML中。 - Hamza Yerlikaya
那么我猜你应该使用Babel http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-LaTeX.html - kindahero
4个回答

7

使用最新版本(但早于版本9-请参见下面的编辑)的Org-mode,您可以使用以下代码将其导出为LaTeX和HTML。在后一种情况下,使用convert(来自ImageMagick工具包)将从tikz代码片段生成的PDF转换为大小为100px x 100px的PNG图像。

#+TITLE: Test
#+AUTHOR: Blah
#+LATEX_CLASS: article
#+LATEX_CLASS_OPTIONS: [american]
#
# Setup tikz package for both LaTeX and HTML export:
#+LATEX_HEADER: \usepackage{tikz}
#+PROPERTY: header-args:latex+ :packages '(("" "tikz"))
#
#+PROPERTY: header-args:latex+ :imagemagick (by-backend (latex nil) (t "yes"))
#+PROPERTY: header-args:latex+ :exports results :fit yes

* One Diamond

#+name: diamond
#+header: :iminoptions -density 600 -resample 100x100
#+header: :file (by-backend (latex "diamond.tikz") (t "diamond.png"))
#+begin_src latex :results raw file
  \begin{tikzpicture}
    \draw (1,0) -- (0,1) -- (-1,0) -- (0,-1) -- cycle;
  \end{tikzpicture}
#+end_src

#+attr_latex: :float nil :width ""
#+results: diamond

* COMMENT setup

#+name: setup
#+begin_src emacs-lisp :results silent :exports none
  (defmacro by-backend (&rest body)
    `(case (if (boundp 'backend) (org-export-backend-name backend) nil) ,@body))
#+end_src

# Local variables:
# eval: (org-sbe "setup")
# End:

此外,在LaTeX中,可以通过以下方式为图片添加标题并将其插入到浮动的figure环境中:
#+caption: A diamond.
#+attr_latex: :float t :width ""
#+results: diamond

请注意,:width属性设置为空字符串,以消除Org-mode的默认行为,该行为将图片宽度在导出到LaTeX时设置为0.9\textwidth
根据此页面,也可以通过将diamond.png替换为diamond.svg并删除与ImageMagick相关的标头,以将图片导出为SVG。
#+TITLE: Test
#+AUTHOR: Blah
#+LATEX_CLASS: article
#+LATEX_CLASS_OPTIONS: [american]
#
# Setup tikz package for both LaTeX and HTML export:
#+LATEX_HEADER: \usepackage{tikz}
#+PROPERTY: header-args:latex+ :packages '(("" "tikz"))
#
#+PROPERTY: header-args:latex+ :exports results

* One Diamond

#+name: diamond
#+header: :file (by-backend (latex "diamond.tikz") (t "diamond.svg"))
#+begin_src latex :results raw file
  \begin{tikzpicture}
    \draw (1,0) -- (0,1) -- (-1,0) -- (0,-1) -- cycle;
    % \node at (0,0) {\(x_i\)};
  \end{tikzpicture}
#+end_src

#+caption: A diamond.
#+attr_latex: :float t :width ""
#+results: diamond

* COMMENT setup

#+name: setup
#+begin_src emacs-lisp :results silent :exports none
  ;; (setq org-babel-latex-htlatex "htlatex")
  (defmacro by-backend (&rest body)
    `(case (if (boundp 'backend) (org-export-backend-name backend) nil) ,@body))
#+end_src

# Local variables:
# eval: (org-sbe "setup")
# End:

请注意,该解决方案不支持tikz代码中的数学宏。htlatex 应该支持基本的数学结构(通过取消上面的两行tikz和lisp代码的注释尝试),但是这个功能似乎需要重新编写,因为生成的SVG是无效的。
编辑 自版本9以来,上述代码变成了以下形式(带有参考图,仅用于说明目的):
#+TITLE: Test
#+AUTHOR: Blah
#+LATEX_CLASS: article
#+LATEX_CLASS_OPTIONS: [american]
#
# Setup tikz package for both LaTeX and HTML export:
#
#+LATEX_HEADER: \usepackage{tikz}
#+PROPERTY: header-args:latex+ :packages '(("" "tikz"))
#+PROPERTY: header-args:latex+ :imagemagick yes :fit yes

* One Diamond

#+name: diamond
#+header: :iminoptions -density 600 -resample 100x100
#+header: :file (by-backend (latex "diamond.tikz") (t "diamond.png"))
#+begin_src latex :results raw graphics
  \begin{tikzpicture}
    \draw (1,0) -- (0,1) -- (-1,0) -- (0,-1) -- cycle;
  \end{tikzpicture}
#+end_src

#+name: fig:diamond
#+caption: A diamond.
#+attr_latex: :float t :width ""
#+results: diamond

Figure [[fig:diamond]] is a diamond.

* Setup                                                            :noexport:
#+name: setup
#+begin_src emacs-lisp :exports none :results silent
  (defmacro by-backend (&rest body)
    `(case org-export-current-backend ,@body))
#+end_src

# Local variables:
# eval: (org-sbe "setup")
# End:

主要区别在于“COMMENT”变成了安装部分的“:noexport”标签(请参见此答案),by-backend宏代码以及latex代码块的结果中的“graphics”属性。

你好,请问 latex+ 到底是什么? - DJJ
#+PROPERTY: header-args:latex+ <args><args> 添加到名为 header-args:latex 的标题参数中。这在文档中有些“可猜测”(尽管我同意这可以改进)。 - nberth

7

我能够使用以下方法从org 8.2.5h将tikz图片导出到html(实际上是使用[org-reveal][1]导出到reveal.js),请参考如下:

#+OPTIONS: tex:imagemagick
#+LaTeX_HEADER: \usepackage{tikz}

* Slide Title

\begin{tikzpicture}
    \draw [blue,fill] (0,0) rectangle (5,3);
    \draw [red,fill] (0,0) rectangle (3,2);
\end{tikzpicture}

希望这对你有所帮助。如果没有 #+LaTeX_Header 行,LaTeX 不能识别tikz并且构建将失败。如果我尝试使用 tex:dvipng 而不是 tex:imagemagick,那么我会得到一个图像,但是渲染不正确。


这正是我整天在寻找的(顺便让它在org-reveal中工作)! - rockt

3

dvipng无法处理tikz。我通过替换dvipng为以下shell脚本,在我的安装上解决了这个问题:

 #! /bin/bash
 shift
 shift
 dvips $9
 gm convert -trim $9 ${9/dvi/png}

现在,我可以通过按下C-x C-c C-l来预览tikz代码片段,或将其导出为HTML。虽然不是理想的解决方案,但对我来说有效。

你有什么进展吗,还是继续使用同样的解决方法?我无法让它工作。 - bright-star

2

我无法让tikzpicture块正常工作,但是根据你提供的Org-Mode文档链接,不应该使用#+begin_latex#+end_latex,只需要使用\begin{...} LATEX_CODE end{...}

这段代码应该可以正常工作。

#+OPTIONS:      LaTeX:dvipng
* Test
  Blah

  \begin{equation}                          % arbitrary environments,
  x=\sqrt{b}                                % even tables, figures
  \end{equation}                            % etc

  If $a^2=b$ and \( b=2 \), then the solution must be either $$
  a=+\sqrt{2} $$ or \[ a=-\sqrt{2} \].

  Done !

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