所以,我一直在使用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)
在撰写本文时,这是一种适用于 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
但这不会阻止它使用\def
which 是全局的。但是,它会为\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
我自己想出了如何做。请注意,这可能不是最优雅的解决方案,因为它没有将乳胶部分放在乳胶文件的开头(即在 \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)