article_image

对于爱阅读之士来说,有一项功能堪称杀手锏,那就是通过 URL Scheme 直达书籍的任何页面。凡举有这项功能的软件,都有资格埤堄群雄,DEVONthink、Logseq、Skim、MarginNote 乃至并非阅读器的 Hook,都纷纷凭借 PDF 页面链接跻身效率工具兵器谱。

然而,或许是忍不住尝鲜,或许是确有需要使用不同的阅读器,我们都不太乐意被一个工具绑死。假设一个人已经很习惯 PDF Expert,那为了 PDF 页面链接而换工具,似乎有些伤元气——毕竟,上一段列出的多数工具,作为阅读器的口碑都不算名列前茅。

我本人先后用 PDF Expert、PDF Viewer 和预览工具看 PDF,它们都没有页面链接。为此,我设计了一套基于自动化工具的 PDF 页面链接方案,理论上支持任何阅读器,并且可以在 Keyboard Maestro 或 Shortcuts 中实现。

Alt text
点击链接打开 PDF 页面

鉴于 Keyboard Maestro 的自动化操作最为润物细无声,远胜 Shortcuts 来回跳转之头晕目眩,本文将以它为例,您如果对 Shortcuts 有兴趣,可以与我联系交流;同时,为尽量照顾到更多的读者,本文以原生预览工具和 PDF Expert 为例。

tldr(预览工具版)

你需要 这个 Keyboard Maestro Macro 和下面这个 URL Scheme。

kmtrigger://macro=【动作ID】&value=【书籍ID】#【页码】
  1. 安装前文提供的 Macro,右键复制其 UUID,取代 【动作ID】
  2. 创建一个 Keyboard Maestro 专用文件夹,找到 Macro 的 Execute Shell Script 步骤,用前述文件夹的路径取代 /Users/Min/KM/
  3. 为 PDF 文件创建一个替身文件(alias);
  4. 用上一步的文件全名(带拓展名)取代 【书籍ID】
  5. 用想要打开的页码取代 【页码】

你可以把做好的链接填入 Obsidian 或其他笔记软件,以便温习笔记时回顾原文;也可以在摘抄簿中附上链接,方便查找出处(Logseq 和 MarginNote 用户应当熟悉这个效果);还可以将 URL Scheme 填入 Anki,复习时一旦遇到生疏之处,随时能够翻看原始材料。

Alt text
从 Anki 跳转到 PDF 页面

原理简析

《如何一键打开 macOS 中的任何文件(以 Keyboard Maestro 为例)》 一文中,我分析了打开任意文件的思路;而打开特定 PDF 的某一页,其实就是百尺竿头更进一步1,让 Keyboard Maestro 走得更远一点,不仅打开文件,还翻到指定的页面。这里的关键是,Keyboard Maestro 可以创建完全自定义的 URL Scheme,这让模仿 DEVONthink 等工具的页面链接成为可能。

将 DEVONthink 的 PDF 页面链接和我最终完成的 Keyboard Maestro 页面链接并置如下,可看到它们结构上的相似之处。和 DEVONthink 一样,我设计的页面链接也包括了书籍和页面两个关键参数,同时,为了唤醒负责打开页面的 Keyboard Maestro Macro,它还需要一个动作的参数。

x-devonthink-item://【书籍ID】?page=【页码】
kmtrigger://macro=【动作ID】&value=【书籍ID】#【页码】

Keyboard Maestro URL Scheme 和 Shortcuts 非常相似,都是先指定一个动作,然后运行它;如有必要,还可以带上一些参数。上面的 Keyboard Maestro URL Scheme,翻译成人话就是“告诉某某 Macro,打开某某书,翻到第几页”。URL Scheme 无非就是把既定的操作转译成 Keyboard Maestro 能够理解的语言。

书籍ID 是动作的核心。DEVONthink 的页面链接之所以可靠,在于它并不依靠文件名来打开 PDF,因此,无论你如何修改原始文件的名称或者移动其位置,都不影响 DEVONthink 打开它。Keyboard Maestro 固然没有 DEVONthink 那样周全的数据库,但我们可以借用 macOS 自带的替身文件当跳板,实现类似 DEVONthink 的可靠跳转。macOS 的替身文件相当于 Windows 的快捷方式,不管原始文件怎么改动或挪动,都可以通过快捷方式打开原始文件,这一特性特别适合拿来制作 URL Scheme,以免文件修改导致链接失效。创建替身文件时,为保持链接简短且避免歧义,我用分钟级别的时间戳数字代替原始文件名,这部分内容已在前作中解释过,这里我们直取其成果,即一串数字 ID,用以指定要打开的书籍。

至于如何翻找页面,我考虑了最通用的方法:模拟键鼠操作。例如在预览工具中,按下 ⌥Option-⌘Command-G、输入数字并按下回车,就完成了翻页操作。Keyboard Maestro 只是把 URL Scheme 中的页面填入翻页输入框,通过键鼠模拟完成了翻页流程。

Alt text
预览工具的翻页窗口

马克吐温曾说,你不能拿着解剖刀去分析一个幽默作家,否则他马上会变成一个悲剧作家。很多自动化工具也是这样,一旦道破背后的原理,就会让人感觉自己知晓了魔术的秘密,事情一下子变得无趣。好在泄了气的感觉只是暂时的,一旦将自动化工具投入使用,你就从那个看魔术表演的观众成了魔术师,事情又有意思起来。

适配 PDF Expert

只需要修改 Keyboard Maestro 动作的键鼠操作部分,几乎就能让它适配任何一款阅读器,例如很多读者在用的 PDF Expert。

Alt text
点击链接在 PDF Expert 中打开页面

以 PDF Expert 为例,只需要更改阅读器后后续的键鼠操作即可,这里 有个现成的版本。详言之:

  1. 将 Execute Shell Script 步骤中的 Preview 改为 "PDF Expert",注意需带英文引号,因为 PDF Expert 名称中有空格,需要用引号包裹起来;
  2. 模拟翻页窗口的快捷键 ⌥Option-⌘Command-G
  3. 粘贴页码,这一步不用动,Macro 会自动从 URL Scheme 中提取页码;
  4. 模拟按下回车键。
Alt text
将 Macro 修改为 PDF Expert 版

小结以及展望

我的电脑上有 DEVONthink,也有 Skim,读 epub 则有 Calibre,这些工具都支持页面链接,按理说不需要再造一副轮子。其实不然。Keyboard Maestro 方案不依赖于某一款阅读器,属于兜底方案,不会因为更换阅读器而导致笔记中的 URL Scheme 失效。而且据我所知,很多人都喜欢尝试新阅读器,这就更有必要把页面链接方案和阅读器解绑,给尝试新工具开辟道路。

不过,本文的方案并不是最终状态,因为在理想情况下,整套页面链接方案应当由两个动作组成,一个负责生成链接,另一个则用于打开链接,就像 DEVONthink 里有“Copy Page Link”的选项,同时也会自动解析 x-devonthink-item:// 开头的链接,而眼下尚需手动创建 URL Scheme。改进并不困难,例如每次都创建一个新的替身文件。并随之生成 URL Scheme;也可以制作一份替身文件名单,每次制作 URL Scheme 时从中调取 ID……但这些方案似乎都不稳定,一时间我还是停留在手写 URL Scheme 的阶段。

🛍 我撰写的付费栏目《信息管理,文件为本位的方案》正在 UNTAG 售卖,对本文话题有进一步讨论,欢迎选购。

🔗 付费栏目链接


  1. 在原理层面,而不是自动化动作的设计细节层面,前文的动作与本文有巨大差别。

author_avatar

Lawyer, macOS/iOS Automation Amateur