题
我如何设置MathJax“序言”以在IPython(或Jupyter)笔记本中使用,以方便他人阅读我的文档(在http://nbviewer.org上使用)并且可以生成LaTeX / PDF的方式重复使用?
背景
我想使用IPython(现在为Jupyter)笔记本来处理文档,稍后再通过LaTeX(使用ipython nbconvert
)将其转换为PDF。问题是如何包括一堆我几乎在每个文档中使用的宏定义。就像是:
\newcommand{\vect}[1]{\vec{#1}}
\newcommand{\abs}[1]{\lvert#1\rvert}
\DeclareMathOperator{\erf}{erf}
就笔记本而言,一个不令人满意的解决方案是将它们简单地包含在笔记本顶部的markdown单元中,该单元嵌入两个美元符号
$$
之间,因此被解释为数学形式。如果在一些介绍性文字之后完成此操作,那么它甚至不会影响输出。问题在于,当转换为LaTeX(用于PDF导出)时,这些命令被嵌入LaTeX文件中的数学环境中。这有几个问题:
诸如
\DeclareMathOperator
之类的命令必须位于LaTeX文档的前言中。命令定义在方程式中是局部的,在本文档的后面版本中不可用。 (这可以通过使用
\gdef
或\global\def
克服,但是然后必须诱使MathJax使用类似\let\gdef{\def}
这样的东西来识别这些命令,而这些东西却隐藏在LaTeX中。我发现做这项工作的任何方式都很难看hack。)有时命令已在LaTeX中定义,并且需要具有
\renewcommand
(MathJax不支持,但又可以由\let\renewcommand\newcommand
等提供)。这对我来说似乎很合理,因为MathJax对可能使用的前导码一无所知用于最终的LaTeX文件)。可能的解决方案是通过添加如下代码来provide a set of macros to MathJax(不确定此处的
\DeclareMathOperator
等同于...)<script type="text/x-mathjax-config">
MathJax.Hub.Config({
TeX: {
Macros: {
vect: ["{\\vec #1}",1],
abs: ["{\\lvert #1 \\rvert}",1]
}
}
});
</script>
到
custom.js
文件,然后提供LaTeX程序包以供转换为PDF时使用。我使用这种方法的问题是:如何分发custom.js
文件和LaTeX样式文件供其他人(合作者和查看者)使用?我希望协作者能够编辑和阅读我的文档,而不必在其全局配置中安装自定义扩展名。具体来说,我要求他们下载/签出我的代码后要求他们运行
python setup.py configure
这样的命令,这会对项目进行本地修改,例如在包含笔记本的所有目录中填充ipython_notebook_config.py
文件,但我不乐意安装扩展程序,或修改其个人全局custom.js
文件。我在这里遇到的绊脚石是,我不知道如何将本地
custom.js
文件中的内容添加到笔记本链中,并且怀疑这可能违反安全策略。最好的解决方案不需要我的合作者采取任何行动。
我希望我的笔记本可以在http://nbviewer.org上运行,并且希望人们能够下载笔记本并生成PDF。 (我认为这排除了使用
custom.js
hacks和分布式*.sty
文件的可能性,但不确定。)我希望能够简单地启动一个新的笔记本,然后开始编写,而不必在每个笔记本的开头插入一堆样板代码,尽管可以使用一种简单的方法来使用笔记本扩展或自动执行此过程。
python_notebook_config.py
中的一些钩子。参考资料
以下帖子解决了其中一些问题,但在大多数方面都不够:
usepackage and making macros in ipython notebook
Physics bra-ket symbols in IPython(特别是this answer注意相关困难)
How do I get MathJax to enable the mhchem extension in ipython notebook
关于从IPython笔记本
pandoc
Getting some problems with pandoc and mathjax
\newcommand environment when convert from markdown to pandoc
笔记本中数学的一般讨论:
Pandoc IPython notebook loses some Mathjax
最佳答案
我认为您可以解决部分问题,但不能全部解决。
首先,绊脚石。我相信(尽管我可能错了),nbviewer除了笔记本本身之外什么都不会看。例如,我看不到它如何运行ipython_notebook_config.py
stored alongside your notebook。这样就排除了这一思路,这意味着我认为您必须硬着头皮为每个笔记本添加样板。但是您至少可以最小化样板。在这种情况下:
您可以在github或其他任何东西上维护您的custom.js
(可能使用一个更具描述性的名称),然后在所有笔记本中添加一行样板,以从URL加载该脚本。您仍然需要样板,但要短得多。
一旦执行了包含javascript的代码单元,它就会保存在笔记本中,这意味着它将在下次浏览器加载它时自动发生,甚至在代码单元执行之前。因此,除非nbviewer阻止javascript的执行,否则它应该可以正常工作。这对于协作者来说也可以使事情顺利进行,因为他们不必下载其他文件。
至于您自己的样式文件,我怀疑任何足以安装ipython和乳胶,下载笔记本并在其上运行nbconvert
的人也将足够熟练地下载.sty
文件。无论如何,我认为没有必要解决这个问题。
关于ipython - IPython(Jupyter)MathJaX序言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28435997/