ipython - IPython(Jupyter)MathJaX序言

标签 ipython ipython-notebook mathjax pandoc



我如何设置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笔记本生成LaTeX文件的(潜在)问题的讨论:


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/

相关文章:

python - 在 IPython 中抑制 Matplotlib 图例警告

javascript - IPython notebook ~ 使用 javascript 运行 python 代码?

ipython - 在本地运行 IPython Notebook 查看器

python - 余弦函数的python sympy计算积分错误

latex - 在 IPython 笔记本中显式加载 AMSmath 会导致 "[Math Processing Error]"

html - 无法在 Google Chrome 中呈现 MathML 内容

python - "InteractiveShell.ast_node_interactivity"- Jupyter notebook 给出的数据太多

python - matplotlib 在 IPython 中不使用 matplotlibrc 文件

python - 交互式 Python - 相对导入的解决方案

css - 如何在 R Shiny 应用程序中左对齐 latex 方程?