所以,我一直在使用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但这不会阻止它使用\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
我自己想出了如何做。请注意,这可能不是最优雅的解决方案,因为它没有将乳胶部分放在乳胶文件的开头(即在 \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)
| 归档时间: |
|
| 查看次数: |
2902 次 |
| 最近记录: |