你可以把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。
文件差异
现在,假设我们做一些小改动。我们想把注释部分的n和r设置成数学斜体,而且我们想找到半径为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 "无效。这很烦人,但它可以通过使用\(
和\)
进入和离开数学模式来解决,而不是对两者都使用美元符号。