
摘要: 介绍一个好用的PDF阅读器:sioyek。该阅读器在GitHub上有8K Star。并且它能和Zotero结合使用。
Sioyek is a PDF viewer with a focus on textbooks and research papers.
Sioyek
是一个专门为科研专业文本阅读而生的阅读器。它有类似于vim
编辑器的键位操作,同时支持自定义键位和拓展插件。
Sioyek
在阅读科研文章或是较长的工具手册时,有许多方便的功能。
下图是Sioyek
的Usage:
它的功能亮点在于:
Vim
编辑器类似的键位操作History Navigation
,在长文本阅读中体验良好Smart Jump
功能,能够智能跳跃想去到的文章位置Portals
功能支持窗口关联总而言之,这是一个专门阅读专业文本的性能强大的PDF阅读器。
结合Zotero
使用,需要在Zotero中将默认PDF阅读器修改成sioyek.exe
的位置。这样,在Zotero中打开的pdf文本就会使用Sioyek打开。
但是会出现一个问题,那就是Sioyek上的注释和书签不能保存下来到Zotero中。这需要我们在Sioyek的相关配置文件中修改参数。以本人的win11操作系统为例子:
## Embed the annotations (highlights and bookmarks) into a new PDF file so they are visible to other PDF readers
embed_annotations ex
取消这一个命令的注释,后边添加的ex
是保存含有注释的pdf的快捷键,你可以自定义为你自己喜欢的键位。
这样,在pdf文本中添加了新注释后,你可以ex
保存一个含有注释的新pdf文件到指定的路径下。
但是,可以预想到,每次保存都这么操作:创建一个新的pdf文件、手动添加文件名、手动选择保存路径。尤其是Zotero的文件存储路径不好寻找、文件名不好识别。一连串负反馈,使得体验感很差。这时我们可以添加一个文件到Sioyek的安装路径之下:
let state = sioyek_api.get_json_state();
let path = state["document_path"];
let parts = path.split(/[\\/]/); // 兼容 Windows 路径
let file_name = parts[parts.length - 1];
let file_name_parts = file_name.split('.');
let today = new Date();
let yyyy = today.getFullYear();
let mm = String(today.getMonth() + 1).padStart(2, '0');
let dd = String(today.getDate()).padStart(2, '0');
let date_str = yyyy + mm + dd;
let new_name = file_name_parts[0] + "_" + date_str + "." + file_name_parts[1];
let dir = parts.slice(0, parts.length - 1).join('/');
let new_path = dir + '/' + new_name;
// 读取目录下所有pdf文件
let fs = sioyek_api.fs;
let files = fs.readdirSync(dir);
let base_name = file_name_parts[0];
let ext = file_name_parts[1];
let regex = new RegExp('^' + base_name + '_\\d{8}\\.' + ext + '$');
let matched = files.filter(f => regex.test(f));
// 如果匹配的文件超过3个,按日期排序,删除最旧的
if (matched.length > 3) {
matched.sort((a, b) => {
let da = a.match(/_(\\d{8})\./)[1];
let db = b.match(/_(\\d{8})\./)[1];
return da.localeCompare(db);
});
let toDelete = matched.slice(0, matched.length - 3);
for (let f of toDelete) {
fs.unlinkSync(dir + '/' + f);
}
}
// 执行批注嵌入
sioyek.embed_annotations(new_path);
然后在以下文件中添加命令:
new_js_command _embed embed.js
最后在配置文件中任意一个空白行添加键位绑定命令:
_embed es
这样,只要我们每次注释完,按下es
,都能在当前编辑的PDF路径下创建一个新的、带有注释的PDF(文件名为:原文件名_日期.pdf)。同时,会检索新建文件前是否超过3个,如果超过就删除日期最早的文件。