IPython(Jupyter)MathJaX序言

时间:2015-02-10 15:53:43

标签: ipython ipython-notebook mathjax pandoc

问题

如何设置MathJax"前导码"用于IPython(或Jupyter)笔记本,以便于他人阅读我的文档(http://nbviewer.org)并且适用于LaTeX / PDF生成的方式重复使用?

背景

我想使用IPython(现在是Jupyter)笔记本来处理我之后通过LaTeX转换为PDF的文档(使用ipython nbconvert)。问题是如何在几乎每个文档中包含一堆宏定义。类似的东西:

\newcommand{\vect}[1]{\vec{#1}}
\newcommand{\abs}[1]{\lvert#1\rvert}
\DeclareMathOperator{\erf}{erf}

等。就笔记本电脑而言,一个令人不满意的解决方案是将它们简单地包含在笔记本顶部的降价单元中,嵌入两个美元符号$$之间,因此它被解释为数学。如果这是在一些介绍性文本之后完成的,那么它甚至不会影响输出。

问题在于,在转换为LaTeX(用于PDF导出)时,这些命令嵌入在LaTeX文件的数学环境中。这有几个问题:

  1. \DeclareMathOperator之类的命令必须包含在LaTeX文档序言中。
  2. 命令定义是等式的本地,在文档的后面部分不可用。 (这可以通过使用\gdef\global\def来克服,但是必须要求MathJax用\let\gdef{\def}来识别这些命令,这些命令在某种程度上是从LaTeX隐藏的。我发现任何方式都可以这项工作相当于丑陋的黑客。)
  3. 有时命令已在LaTeX中定义,需要\renewcommand(MathJax不支持,但也可由\let\renewcommand\newcommand等提供,这对我来说似乎是合理的,因为MathJax不能了解最终LaTeX文件可能使用的前导码。)
  4. 可能通过添加代码来解决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文件,然后在转换为PDF时提供包含的LaTeX包。我使用这种方法的问题是:如何分发custom.js文件和LaTeX样式文件供其他人(协作者和查看者)使用?

    1. 我希望协作者能够编辑和阅读我的文档,而无需在其全局配置中安装自定义扩展。具体来说,我可以要求他们在下载/签出我的代码后运行python setup.py configure之类的命令,该代码对项目执行本地修改,例如填充ipython_notebook_config.py个文件包含笔记本的所有目录,但不满意安装扩展或修改其个人全局custom.js文件。

      我的绊脚石是,我不知道如何将本地custom.js文件中的贡献添加到笔记本链中,并怀疑这可能违反了安全策略。

      最佳解决方案不需要我合作者的任何行动。

    2. 我希望我的笔记本能够在http://nbviewer.org上工作,并且让人们能够下载笔记本并制作PDF。 (我认为这排除了使用custom.js黑客和分布式*.sty文件的可能性,但我不确定。)

    3. 我希望能够简单地启动一个新的笔记本,然后开始编写而不必在每个笔记本的开头插入一堆样板代码,尽管可以采用一种简单的方法来自动执行此操作使用笔记本扩展程序或python_notebook_config.py中的某些挂钩进行处理。

    4. 参考

      以下帖子解决了其中一些问题,但在大多数方面都不尽如人意:

      讨论来自IPython笔记本的pandoc制作LaTeX文件的(潜在)问题:

      笔记本中数学的一般讨论:

1 个答案:

答案 0 :(得分:2)

我认为你可以解决一些问题,但不是全部。

首先,绊脚石。我相信(尽管我可能错了)nbviewer除了笔记本本身之外什么都不看。例如,我看不出它如何运行ipython_notebook_config.py stored alongside your notebook。因此,排除这种思路,这意味着我认为你必须咬紧牙关并为每个笔记本添加样板。但是你至少可以最小化样板。就是这样:

您可以在github上维护您的custom.js(可能在更具描述性的名称下),然后在您的所有笔记本上添加一行样板,以从URL加载该脚本。你仍然需要样板,但它会短得多。

一旦你执行了包含javascript的代码单元,就会将其保存在笔记本中,这意味着它会在下次浏览器加载时自动发生,甚至在代码单元执行之前。因此,除非nbviewer阻止javascript的执行,否则它应该正常工作。这也可以使合作者很好地工作,因为他们不必下载其他文件。

至于你自己的样式文件,我怀疑任何足够复杂的人来安装ipython和latex,下载你的笔记本,并在其上运行nbconvert也足够复杂,可以下载.sty文件。无论如何,我认为没有必要这样做......