将组织特殊文本块导出到Latex

时间:2015-05-31 21:21:28

标签: emacs latex org-mode

我的问题是导出这个组织块

#+BEGIN_NOTE
some text here
#+END_NOTE

到这个Latex代码

\begin{bclogo}[logo=\bcattention, noborder=true, barre=none]{some text here}
\end{bclogo}

有没有办法自定义如何在Latex中导出这个文本块?

3 个答案:

答案 0 :(得分:2)

我建议使用类似的东西:

#+LaTeX_HEADER: \usepackage[tikz]{bclogo}
...
#+ATTR_LATEX: :options [logo=\bcattention, noborder=true, barre=none]{some title here}
#+BEGIN_bclogo
some text here
#+END_bclogo

除非你真的想使用笔记,否则使用LaTeX特殊块非常适合。

答案 1 :(得分:1)

您可以使用org-mode中的自定义块执行此操作:

+ begin_bclogo

这里的一些文字

+ end_bclogo

然后,使用过滤器修改导出,如下所示:

(defun ox-mrkup-filter-special-block (text back-end info)
  (let ((text (replace-regexp-in-string "\\\\begin{bclogo}" "\\\\begin{bclogo}[logo=\\\\bcattention, noborder=true, barre=none]{" text)))
    (replace-regexp-in-string "\\\\end{bclogo}" "}\\\\end{bclogo}" text)))

(let ((org-export-filter-special-block-functions '(ox-mrkup-filter-special-block)))
(find-file (org-export-to-file 'latex "custom.tex")))

出口到:

\begin{bclogo}[logo=\bcattention, noborder=true, barre=none]{
some text here
}\end{bclogo}

这似乎接近你想要的。我不确定你怎么能在环境中找到一个身体。我认为你需要使用一个属性来设置{}中的文本,然后使用文本作为正文。这可能不容易在过滤器中实现,并且可以在自定义导出中更好地实现。

答案 2 :(得分:1)

您可以保留NOTE环境,并通过特定于乳胶的过滤器(我修改John的代码)将其替换为bclogo

(defun my/latex-process-NOTE-blocks (text backend info)
  "Filter special blocks from latex export."
  (when (eq backend 'latex)
    (let ((text (replace-regexp-in-string "\\\\begin{NOTE}" "\\\\begin{bclogo}[logo=\\\\bcattention, noborder=true, barre=none]{" text)))
      (replace-regexp-in-string "\\\\end{NOTE}" "}\\\\end{bclogo}" text))))

(eval-after-load 'ox '(add-to-list
                       'org-export-filter-special-block-functions
                       'my/latex-process-NOTE-blocks))

如果您想对所有使用胶乳的后端执行此操作,可以将(eq backend 'latex)替换为(org-export-derived-backend-p backend 'latex)

如果您想确保该块以\begin{NOTE}开头:

(defun string/starts-with (string prefix)
  "Return t if STRING starts with prefix."
  (and (string-match (rx-to-string `(: bos ,prefix) t) string) t))

(defun my/latex-process-NOTE-blocks (text backend info)
  "Filter special blocks from latex export."
  (when (eq backend 'latex)
    (if (string/starts-with text "\\begin{NOTE}")
        (let ((text (replace-regexp-in-string "\\\\begin{NOTE}" "\\\\begin{bclogo}[logo=\\\\bcattention, noborder=true, barre=none]{" text)))
          (replace-regexp-in-string "\\\\end{NOTE}" "}\\\\end{bclogo}" text)))))

(eval-after-load 'ox '(add-to-list
                       'org-export-filter-special-block-functions
                       'my/latex-process-NOTE-blocks))