本来应该自己先多尝试几次, 但是最近要准备讲组会时间有限, 没工夫仔细啃源码啃文档. 另考虑到这种需求应该不少(虽然我没有找到特别相关的帖子和话题, 可能是关键词不合适), 遂新建此话题, 欢迎大家讨论, 如果有大佬知道既存的解决方法或者有思路还请不吝赐教ORZ.
目前先简单写了正则表达式用来跳转.
需求
希望在org-mode中, 对于align这类允许为每行公式打label的多行公式环境, 实现对环境中每个公式按需以[[...]]形式引用, 并且允许跳转, 同时控制导出格式(这个应该不难).
背景
本人用org-mode整理笔记, 因为使用emacs-nox在终端里没有预览(虽然读不成问题, 但还有时还是费精力, 比如需要扫一眼找某条式子的时候), 以及有时会有分享给别人的需要, 所以同时也导出为.pdf, 对排版有简单的要求. (ps. 使用emacs-nox是因为使用WSL2, 不想再绕一圈处理GUI有关的问题以及输入法之类的, 当然最根本的原因还是emacs-nox已经满足我的几乎所有需求了).
之前一直用\label{eq:...}和\eqref{eq:...}来做公式的交叉引用. 最近用的比较多, 公式的引用多了, 有点不满足于用搜索找label, 同时感觉在org里写\label{}, \eqref{}有点笨, 于是希望能用org链接格式(eg. [[...]])实现对公式的引用和跳转.
注意到#+NAME可以自动给公式环境在导出时添加\label{eq:...}格式的label, 对其进行引用也可以导出为\ref{eq:...}. 但是这只能为一个\begin{...}...\end{...}添加一个label.
个人思路
有一些思路和对应的(可能的)弊端如下所示(没有先后顺序和依赖关系).
- 干脆避开这个问题. 把需要引用的, 比如
align环境中的多个公式拆成多个用equation环境包裹的公式. 但是这失去了align对公式进行对齐的功能. - 用
org-add-link-type(之类的)添加一个新的link类型, 定义跳转函数和导出, 对于跳转, 最简单的方法可能是用正则表达式根据link的内容, 在当前buffer中全文搜索符合的\label{...}, 但我好奇有没有更充分利用org原生功能的方法(感觉全文查找太笨了, 以及会不会遇到性能问题). 也许可以在自定义link类型的基础上借助原生的关键字减小查找范围, 然后用正则表达式精确定位\label{...}? 但是我不知道这样好不好实现. - 之前基于对
org-roam.db的查询写了一些方便我查看和管理org-roam node的函数, 所以想到能不能借助数据库做这件事. 但是有感觉再引入一个数据库有点多余, 以及我并不很熟悉sql.