数学人在计算机上做笔记要弄一整个\(\LaTeX\)文件。用自己的文本编辑器修改。编译成PDF。出现一堆看不懂的编译ERROR,手动修改。编译时间也要几秒。这个系统原本是为了生成可以打印出来的论文的,因为\(\TeX\)本质是一个排版软件。对于论文来说,输出的目的就是一个完美的排版好的论文。
但如果目的只是为了记录点笔记,或者管理自己研究中发现的东西,实际上根本用不到排版的功能。甚至就算是发论文,真的排版的使用也极少。
以下是写数学笔记的人常要用到的功能。
那我们引入下面的定理
\begin{theorem}[代数基本定理]\label{thm:algebra}
啊这个定理该说的东西blahblah
\end{theorem}
那我们引入下面的定理
定理1.1 (代数基本定理)
啊这个定理该说的东西blahblah
$x^2$
\(x^2\)
\cref{section:introduction}提到的\cref{theorem:algebra}显示
Section 1.1提到的定理1.1显示,
可以看Bakh的论文\cite{bakh98, bakh99}
可以看Bakh的论文[3,4]
这个系统用来记录笔记或者写论文,都有很大的缺陷。
所以想要一个新的记录笔记的系统。这个系统应该是在浏览器里,输出HTML,便于分享,也便于交互。
在写文章中我会觉得人存在于两个模式之中。写作和编辑。读者会在阅览模式。
这几个模式下,人的行为是不一样的。
几乎所有的时间是在写东西。目标是快速的将自己脑子里的东西变成(接近)自己想要的输出。
这个时候,大多时间需要输入部分无摩擦。可以看任何一个数学人用的\(\LaTeX\)文档。用数学公式的次数远远大于任何其他功能。什么加粗,列表,等等,在能快速插入数学公式之前都没啥意义。\(\LaTeX\)实际上用\( \)
来控制公式,只有\(\TeX\)才是用$ $
. 但是$
是主流的最大原因就是输入数学公式的时候需要尽量减少摩擦.
而写作的时候的确可以不需要live preview。人会输入很多东西,才要知道具体输出是什么。感觉一整段话写的差不多了,才会想看看输出结果是什么。
文章几乎已经完全写好了,要开始对文章做一些修改。这个时候,人主要是看输出的结果。在输出的结果里看到了问题,希望可以直接修改。
用现有的系统,这是非常痛苦的。我\(\LaTeX\)写好了东西,改文章的时候一般是打印出pdf,仔细的看。找到了所有有问题的地方,再回到代码那里一次性的做改动。很快会发现每一个改动平均可能要花20秒的时间来找到它在源代码的哪个地方(inverse search很重要)。如果有所以60处小改动,20分钟就花在了纯粹的locating上。
如果可以直接在输出上做改动,则好很多。
人只是想好好的读文章,对修改没有什么要求。这种情况应该有一些让读文章舒服的工具。也就是尽量保证人阅读的flow。
比如读文章的时候常常会有reference一个其他东西。如引用一个定理、citation等东西的时候,我希望很快的知道那个定理究竟是什么,而不是翻页翻到了那里看一下,再回来。有个pdf浏览器有那种quick preview的功能,可以到了某个链接迅速的显示出那东西究竟是什么,甚至包括少许上下文。
所以应该有个存在3个不同的部分的系统,并且可以互相对应。也就是以下3个层之间的变换。
研究过Pandoc的人会发现这不就是pandoc: Reader, Pandoc AST, Writer。就是要多加点信息,可以保证从输出层对应到输入层。
这边要提到Typora那样。输入和输出部分几乎是放在一起的。也就是除了光标所在的地方,都是输出的样式。Typora的granularity过细。以前的版本改比较大数学公式的时候各种跳来跳去痛苦极了,不知道现在如何。改为每一行的granularity可能不错。也就是光标所在的行,只显示输入层,光标不在的行都是输出层。或者让用户可以自己选择。
要满足这样的系统,上面三层应该满足某些局部对应和局部转换的功能。好像有个叫Bidirectional Transform的东西可以研究研究。
市面上有一些可以用做笔记的工具,大多数用markdown。我测试过这些系统: Quiver, Roam Research, Obsidian, Coauthor, Dropbox Paper, Notion, Typora, 我自己博客(Hakyll + Pandoc + 自己的一些脚本), tiki wiki, MediaWiki, Dokuwiki, 飞书,Zettlr, Logseq。但上面这几点全能做到少之又少。数学家喜欢的功能非常小众,他们的需求有时其他人用不上。很多工具决定了一定要支持的是Markdown,整体是为了markdown用户考虑的。
以下功能很少一个软件完全支持。
$$
, 而普通人inline数学副号应该用单个$
。大多系统会有这些对习惯了某种latex方式来说反人类的设计。本人用自己博客的做笔记。
我现在就是文本编辑器里改改,觉得差不多了保存,手动刷新一下浏览器样子。例子:
单个页面功能上基本完美了。我写东西是在自己的sublime text里写。纯文本编辑体验自然极好。但真实的笔记,不是一切就一个文本。而且,做不到WYSIWYG。
这些系统主要不是为了做知识管理,纯粹是为了创建文档的。
如果用过LyX, TeXmacs或者已经消失的Scientific WorkPlace。会发现这些软件几乎达到了要求。写作和编辑都不怎么费力。其中他们甚至可以直接对做那些公式不改代码的做改动,可怕至极。TeXmacs是里面最成熟的软件,完全可以替代Word。但主要的问题是这个还是单个文档系统,并没有要成为一个真的笔记软件。不过TeXmacs可以很容易的用Scheme写插件,所以理论上来说应该也是可以搞起来。
有些稍微小众一点的软件。Compositor似乎是在DVI输出上面直接做修改。很久以前BaKoMa成功的做到了可以在输出上做LaTeX的修改。
听说SwiftLaTeX是一个能在浏览器里用的\(\LaTeX\) WYSIWYG editor。但是暂时好像用不起来。
这些工具和平台有很大关系。需要下载这些软件,而不适合和其他人协作。
有一个Mathcha的工具,可以说是搬WYSIWYG系统到浏览器里。里面很多设计不错,但整个软件基本功能不够完善。作者后来走的比较偏,花了大量时间去搞画图功能去了。作者也试图做过协作功能,不过迟迟没有出来。
Typst是个试图替代LaTeX的系统。
Fidus Writer似乎是想替代Word,而且主要服务于学术界人士。有点像是一个你写作的所有信息都包括在里面。其中有citation啊之类的东西。
texpad是一个专门写latex的系统。这个系统非常的polished,有很多让生活很舒服的工具。可以从那里面学到不少idea。
一个notes管理系统
数学家有的用Overleaf。等于把LaTeX搬到了网上。每一个Project有个文件夹。自己可以自己写LaTeX并且在网上preview pdf输出。自己写LaTeX,Overleaf服务器去compile出pdf文件,再显示在用户面前。
大家共用一个Dropbox。大家在本机上写文章然后compile。也有团队直接用git替代dropbox。
这些系统对于权限的管理都来自于给单个Project/文件夹的权限。
每一个Project可以给一些人权限。在这个Project里,任何文件的权限都是完全一样的。Dropbox的Project就等同于一个文件夹。
如果是多人修改同一个文件。会有一定的沟通问题。Overleaf就有直接的聊天系统。但是有时需要直接指出文件的某个部分。比如作者A没看懂作者B写的这句话,于是加一个comment,表示没有看懂。这样作者B再来看的时候会想应该如何解释。
一般做法是在LaTeX文档里写出这个comment。
tiptap 用来做浏览器里的editor的程序。
Lexical 也是用来做浏览器里的editor的程序。
Mathquill WYSIWYG修改数学公式,可能会比LaTeX好用也说不定。
mathlive 和上面一样.
Kerodon 应该算是一个网络版本的数学textbook, 用了一些有用的技术。
Penrose 用语言画图
SVG Math 解决katex实在太耗dom资源的问题:用SVG。
vditor 算是开源的Typora了。要研究下能否自己写parser。
vale 英文Linter
A Language for Bi-Directional Tree Transformations
LaTeX 相对于 Word 有什么优势?
An Efficiency Comparison of Document Preparation Systems Used in Academic Research and Development
自己开发是没能力弄出Typora那样的东西。我前端能力不行。现有的设想是将现有的博客系统更新一下 + 一个text editor的plugin。作为v0.1的心痛。
[[
之后就冒出来一个可以autocomplete的现在可以引用的东西。或者有啥其他快捷键。这边要更加完善自己的markdown variation。叫Chicken Markdown。和Pandoc Markdown非常像。主要是解决pandoc markdown作者还没有放入他们系统里,或者永远不准备放入系统里的一些syntax。
graph TD
A{Editor} -->|Update .md file| C{Trigger Build}
D -->|related meta as yaml| E
D{Meta Store}
D -->|Update through plugins| A
C -->|Update through file| D
C -->|start compiler| B
E -->|Pandoc + Pandoc Filters| F[Pandoc AST]
F -->|HTML Writer + Template + Optimizer| H[HTML]
B[.md file] --> |Preformatter|E[Pandoc Markdown + yaml]
H -->|update preview| A
subgraph Compiler Pipeline
B
E
F
H
end
估计我这边的做法。
优点:
缺点:
没想到怎么搞。应该也是project based。 Chickenglass大概设计是每个人可以开project,整个project设定permission。等同于个人版上加上个权限系统。但是具体的协作还是有一堆要考虑的。
在个人版Chickenglass上线之前不用考虑。