自定义组织模式导出

Shi*_*nth 8 emacs org-mode

所以,我一直在使用org-mode来研究我的研究笔记.我喜欢如何无缝导出乳胶(对于我的论文)和HTML(对于我的博客).但是,每当我使用带有#+ LATEX_HEADER的\newcommand定义宏时,这些都不会显示在HTML导出中.

我目前通过将所有这些命令(\newcommand \newcommand等等)放在顶部,然后从tex文件中手动删除"("和")"来处理此问题.

我希望我能做的就是为这些命令保留一个抽屉,并自定义组织模式的html和latex导出以适当地处理这个抽屉.

例如,我会在org文件中添加以下内容:

:LATEX_MACROS:
\newcommand{\norm}[1]{\lVert{#1}\rVert}
\newcommand{\abs}[1]{\lvert{#1}\rvert}
\newcommand{\half}{\frac{1}{2}}
:END:
Run Code Online (Sandbox Code Playgroud)

导出后,这将在标题部分和html文件中逐字显示在乳胶文件中

\(
\newcommand{\norm}[1]{\lVert{#1}\rVert}
\newcommand{\abs}[1]{\lvert{#1}\rvert}
\newcommand{\half}{\frac{1}{2}}
\)
Run Code Online (Sandbox Code Playgroud)

Blo*_*out 6

在撰写本文时,这是一种适用于 Org、pdflatex 和 MathJax 的独立方式。确保抽屉(或至少LATEXMACROS抽屉)已导出(这是默认设置),然后在 Org 文件的顶部附近插入:

#+OPTIONS: toc:nil
#+DRAWERS: LATEXMACROS ...

:LATEXMACROS:
@@html:<div style="display: none">@@
\(
\global\def\mymacro{...}
\global\def\mymacrow2args#1#2{...}
...
\)
@@html:</div>@@
:END:

#+TOC: headlines
Run Code Online (Sandbox Code Playgroud)

这可以解决以下问题:

  • 我们必须使用数学环境(此处\( ... \)),否则 Org 会转义 TeX 语法。

  • 我们不能使用\newcommand,因为 LaTeX 期望它们出现在序言中,而 MathJaX 没有收到它。\newcommand可以在序言之外使用,但是 LaTeX(与 MathJax 不同)将定义的宏限制为当前数学环境。我们通常希望在文件的任何地方使用它们。

  • 我们不能使用普通的,\def因为它\newcommand在作用域方面表现得像(MathJax 是全局的,LaTeX 是本地的)。我们也不能使用\xdef,因为 MathJax 不知道。

  • MathJax 不知道,\global但这不会阻止它使用\defwhich 是全局的。但是,它会为\global网页中的每个打印一个红色警告。为了摆脱它们,我们将数学环境放在一个未显示的 HTML 部分中。

  • 对于 MathJax,宏将不会在其默认位置的目录中及时定义。如果您在标题中使用宏并想要一个目录,请禁用默认的 with#+OPTIONS: toc:nil并手动将其添加到 drawer 之后#+TOC: headlines

注意事项:

  • 无法预览使用自定义宏的乳胶片段,因为小的 TeX 文件 Org build 不包括我们的环境。

  • 与 不同\newcommand\def默默地替换任何东西。此外,它的语法略有不同。

  • 数学环境在 pdflatex 的输出中占据了一些垂直空间,所以我们必须把它放在无关紧要的地方(例如在第一个标题之前)。

  • 这可能真的取决于版本:

    • Org 模式在导出 LaTeX 宏方面可能会变得更好(例如,通过在解析时更智能地将它们发送到 MathJax #+LATEX_HEADER,提供新的导出选项,而不是转义\newcommand并将它们放入正确处理的序言中)。

    • MathJax 可能会开始接受或忽略\xdef的别名(以便不再需要 HTML 部分技巧)。\def\global


Shi*_*nth 3

我自己想出了如何做。请注意,这可能不是最优雅的解决方案,因为它没有将乳胶部分放在乳胶文件的开头(即在 \begin{document} 之外),但它对我来说足够好了。

(setq org-export-blocks
  (cons '(latexmacro org-export-blocks-latexmacro) org-export-blocks))

(defun org-export-blocks-latexmacro (body &rest headers)
  (message "exporting latex macros")
  (cond
   ((eq org-export-current-backend 'html) (concat "\\(" body "\\)"))
   ((eq org-export-current-backend 'latex) body)
   (t nil))
)
Run Code Online (Sandbox Code Playgroud)