Org-mode:轻量级笔记本的使用教程

266 阅读4分钟

你可以把org-mode看成是一种简单的markdown,一种可以导出为更高级的格式(如HTML或PDF)的纯文本文件。它远不止这些,但这是一个合理的起点。

Org-mode也与源代码集成。你可以在你的文件中嵌入代码,当你把文件导出到其他格式时,代码和/或运行代码的结果会出现。

作为笔记本的Org-mode

你可以把org-mode作为一个笔记本使用,类似于Jupyter笔记本,但要简单得多。org文件是一个纯文本文件,你可以在你的编辑器中执行嵌入式代码。你不需要浏览器,也没有隐藏状态。

这里有一个混合标记和代码的例子:

    The volume of an n-sphere of radius r is 

    $$\frac{\pi^{\frac{n}{2}}}{\Gamma\left(\frac{n}{2} + 1\right)}r^n.$$

    #+begin_src python :session
    from scipy import pi
    from scipy.special import gamma

    def vol(r, n):
        return pi**(n/2)*r**n/gamma(n/2 + 1)

    vol(1, 5)
    #+end_src

如果你要把文件导出为PDF,那么球体的体积方程就会用LaTeX编译成一个图像。

要运行代码[1],把你的光标放在代码块的某个地方,然后输入C-c C-c 。当你这样做时,下面几行将出现在你的代码下面。

    #+RESULTS:
    : 5.263789013914324

如果你认为你的org-mode文件是主要的,而你只是插入一些代码作为一种抓取区域,org-mode的一个优点是你永远不会离开你的编辑器。

Jupyter笔记本

现在让我们把它与Jupyter笔记本进行比较。Jupyter通过单元格来组织一切,而一个单元格可以包含标记或代码。所以你可以创建一个标记单元,并输入完全相同的介绍性文字[2]:

    The volume of an n-sphere of radius r is 

    $$\frac{\pi^{\frac{n}{2}}}{\Gamma\left(\frac{n}{2} + 1\right)}r^n$$.

当你 "运行 "单元格时,LaTeX被处理,你看到的是排版好的表达,而不是它的LaTeX源。你可以点击该单元格,再次看到LaTeX代码。

然后你将在另一个单元格中输入Python代码。当你运行这个单元格时,你会看到结果,就像在org模式下一样。你可以像在org-mode中一样把你的笔记本导出为PDF。

文件差异

现在,假设我们做一些小改动。我们想把注释部分的nr设置成数学斜体,而且我们想找到半径为2而不是1的5球体的体积。在Jupyter和org-mode [3]中,我们通过在 "n "和 "r "周围加上美元符号来做到这一点,并且我们将vol(1, 5) 改为vol(2, 5)

让我们在两个版本的org-mode文件和两个版本的Jupyter笔记本上运行diff

org文件中的差异很容易发现:

    1c1
    < The volume of an n-sphere of radius r is 
    ---
    > The volume of an \(n\)-sphere of radius \(r\) is 
    12c12
    < vol(1, 5)
    ---
    > vol(2, 5)
    16c16,17
    < : 5.263789013914324
    ---
    > : 168.44124844525837

然而,Jupyter文件中的差异则更为复杂:

    5c5
    <    "id": "2a1b0bc4",
    ---
    >    "id": "a0a89fcf",
    8c8
    <     "The volume of an n-sphere of radius r is \n",
    ---
    >     "The volume of an $n$-sphere of radius $r$ is \n",
    15,16c15,16
    <    "execution_count": 1,
    <    "id": "888660a2",
    ---
    >    "execution_count": 2,
    >    "id": "1adcd8b1",
    22c22
    <        "5.263789013914324"
    ---
    >        "168.44124844525837"
    25c25
    <      "execution_count": 1,
    ---
    >      "execution_count": 2,
    37c37
    <     "vol(1, 5)"
    ---
    >     "vol(2, 5)"
    43c43
    <    "id": "f8d4d1b0",

Jupyter笔记本里有很多额外的东西。这是一个微不足道的笔记本,而更复杂的笔记本有更多额外的东西。笔记本的一个明显的小变化会导致底层笔记本文件的大变化。这使得在版本控制系统中跟踪Jupyter笔记本的变化变得困难。

相关文章

[1] 在这之前,你必须告诉Emacs,Python是你想在org模式下运行的语言之一。我在 init 文件中写了下面一行,告诉 Emacs 我希望能够运行 Python、DITAA、R 和 Perl。

    (org-babel-do-load-languages 'org-babel-load-languages '((python . t) (ditaa . t) (R . t) (perl . t)))

[2] org模式会让你使用\[\] ,为显示的方程加上LaTeX代码的括号,它也会让你使用$$ 。Jupyter只支持后者。

[3] 在org-mode中,在变量周围加上美元符号有时有效,有时无效。在这个例子中,它对 "r "有效,但对 "n "无效。这很烦人,但它可以通过使用\(\) 进入和离开数学模式来解决,而不是对两者都使用美元符号。