[讨论]你的emacs文献/知识管理方案是什么?

我想配置一个理想的文献管理环境,在论坛里搜不到很好的方案。于是自己去melpa检索bib,发现有不少的package。package多了反而不好选择,大家对这些package使用体验如何?或是直接请教一下大家,平时用的文献管理/知识管理方案如何?能否介绍一下?谢谢!

我个人认为好的方案要:方便导入文献信息、联网自动下载pdf以及管理,顺畅地阅览、搜索和标记pdf,很好的结合auctex/latex撰写论文并生成格式化引文。一言以概之,可以形成高效的知识输入与输出的工作流。当然不限于这样的科学/专业知识的管理,也能很好实现平时一些感兴趣知识的管理。

4赞

一开始我也想拿Emacs来折腾,后来转用zotero了,配合坚果云webdav实在是太爽了。

1赞

快两年前,我在 Emacs-china 的第一个帖:

当初想从 Mendeley 慢慢转到 Emacs 上, 结果陷入 Emacs 越来越深… (这辈子估计出不来了.)

先打个草稿, 总结一下我的流程:

* org-ref 
* org-brain
* org-download
* org-web-tool
* org-agenda
* org-capture
* org-noter
* org-pdftools
* helm-bibtex
* info
3赞

我记得zotero也可以配合emacs hhh

哈哈,文献管理是刚需。我也想弃用那些常见的文献管理软件,觉得org-mode这么强大的扩展应该可以添加其他扩展包搭配出理想的文献管理环境和高效的知识管理工作流。我在论坛里也只看到前辈你和 @fu123456 在这方面比较有经验,期待你们再详细分享一下自己的工作流😄

为什么一定要用emacs来做你说的这些事情呀?现在有大量成熟的解决方案级app,为什么不用呢?为什么要用几千行代码量级的个人/社区维护的emacs插件?

另外我觉得文献管理和知识管理并不是一回事儿,这个不可以混淆的。文献管理的话楼上也提到了,Zotero、Mendeley都不错,也可以尝试一下Bookends和EndNote(这个巨贵……)。

至于知识管理,则是org-mode之流的强项,毕竟支持wikilinks,可以在不同的知识之间穿针引线。

最后介绍一下我个人的工作方法。我个人不用Emacs来管理文献/知识。我在macOS上一般用DEVONthink来存储我下载的论文,每个论文可以附带自定义元数据,因此我就会建立几个诸如【会议/期刊】、【发表年限】、【BibTeX】之类的数据域,在每次定期整理论文的时候手动填充。

至于知识管理,如果你偏向【知识整理】的话,推荐Tinderbox,功能在很多方面比orgmode更强。如果你偏向【知识收集】的话,Evernote之流更适合你。

自问自答:为什么我不用orgmode来做知识管理?因为我母语还是中文,当我用中文输入法写org-mode的时候,按各种keybinding总是会特别奇怪。况且我还是用evil的…… 这点使用体验上的不足,严重影响了我用emacs来记笔记的愿望,因此我至少对我来说,orgmode不是一个好的选择。

4赞

目前没有任何一个软件能让人满意,暂时忘了Emacs吧。相对而言,zotero和mendeley算好一些的。而且文献中常用格式pdf本身就不适合在现在普遍流行的带鱼屏上阅读,也不适合在小屏幕上阅读,这是任何管理软件都救不了的。还有,科技文献的写作不够“格式化”,而且引用越来越多,作者在引用时避重就轻、掐头去尾的现象更普遍,所以要想用自动的梳理其中的逻辑链条、形成知识网络来辅助学习,也还是比较困难的,本质上还是要靠自己来分类。对软件的吐槽略,嗯。

1赞

没人用ebib吗?我之前也用zotero,现在觉得org-ref + ebib就够了。ebib配合pdf-tools、pdf-noter用来管理bibtex和对应的pdf和笔记,org-ref配合helm用来在线和本地搜索ref,并插入。附上我的配置:

(use-package ebib
  :general
  ([f5] 'ebib)
  (ebib-multiline-mode-map
   "C-c C-c" 'ebib-quit-multiline-buffer-and-save
   "C-c C-q" 'ebib-cancel-multiline-buffer
   "C-c C-s" 'ebib-save-from-multiline-buffer)
  :custom
  (bibtex-autokey-name-case-convert-function 'capitalize)
  (bibtex-autokey-titlewords 0)
  (bibtex-autokey-year-length 4)
  (ebib-uniquify-keys t)
  (ebib-bibtex-dialect 'biblatex)
  (ebib-index-window-size 10)
  (ebib-preload-bib-files '("~/Dropbox/Bibliography/references.bib"))
  (ebib-notes-use-single-file "~/Dropbox/Bibliography/Notes.org")
  (ebib-file-search-dirs '("~/Dropbox/Bibliography/bibtex-pdfs/"))
  (ebib-reading-list-file "~/Dropbox/Bibliography/ReadingList.org")
  (ebib-keywords-file "~/Dropbox/Bibliography/ebib-keywords.txt")
  (ebib-keywords-field-keep-sorted t)
  (ebib-keywords-file-save-on-exit 'always)
  (ebib-file-associations '(("pdf")) "using Emacs to open pdf")
  (ebib-use-timestamp t "recording the time that entries are added")
  (ebib-index-columns '(("Entry Key" 20 t)
			("Author/Editor" 40 nil)
			("Year" 6 t)
			("Title" 50 t)))
  (ebib-index-default-sort '("timestamp" . descend)))

(use-package org-ref
  :general
  (z-spc-leader-def "r" 'org-ref-hydra/body)
  :pretty-hydra
  ((:color red :quit-key "q")
   ("Insert"
    (("i" org-ref-helm-insert-cite-link "citation key")
     ("r" org-ref-helm-insert-ref-link "ref link")
     ("l" org-ref-helm-insert-label-link "label link"))
    "Browse"
    (("b" helm-bibtex "bibtex")
     ("s" crossref-lookup "lookup"))
    "Add"
    (("a" crossref-add-bibtex-entry "new entry")
     ("d" doi-add-bibtex-entry "doi"))))
  :custom
  (bibtex-dialect 'biblatex)
  (org-ref-bibliography-notes "~/Dropbox/Bibliography/Notes.org")
  (org-ref-default-bibliography '("~/Dropbox/Bibliography/references.bib"))
  (org-ref-pdf-directory "~/Dropbox/Bibliography/bibtex-pdfs/")
  (org-ref-show-broken-links nil)
  (org-ref-default-ref-type "eqref")
  (org-ref-default-citation-link "citet")
  :config
  (require 'org-ref-citeproc)
  (defun org-ref-grep-pdf (&optional _candidate)
    "Search pdf files of marked CANDIDATEs."
    (interactive)
    (let ((keys (helm-marked-candidates))
	  (get-pdf-function org-ref-get-pdf-filename-function))
      (helm-do-pdfgrep-1
       (-remove (lambda (pdf)
		  (string= pdf ""))
		(mapcar (lambda (key)
			  (funcall get-pdf-function key))
			keys)))))
  (helm-add-action-to-source "Grep PDF" 'org-ref-grep-pdf helm-source-bibtex 1)

  (setq helm-bibtex-map
	(let ((map (make-sparse-keymap)))
	  (set-keymap-parent map helm-map)
	  (define-key map (kbd "C-s") (lambda () (interactive)
					(helm-run-after-exit 'org-ref-grep-pdf)))
	  map))
  (push `(keymap . ,helm-bibtex-map) helm-source-bibtex))


7赞

有没有 DEVONthink 的同类產品可以比较的?我只要能用来管理 pdf 文献就可以了,其它的如笔记,同步,编辑之类的功能有点多余

科研 newbie,我的一点经验,供参考。最开始只用 zotero,它的 connectors 收集导入下载文献是真的好用,然后下了一些插件,但是总是觉得没法很好管理、标注。前段时间淘 spacemacs layer 看到了 bibtex 那个包,试着把 org-ref(& helm-bibtex) 配好了,还是通过 zotero 收集文献,利用 better bibtex 自动导出全 library 到 bib 文件,然后可以在 Org mode 中实现引用、打开 PDF、对文献做笔记。但是目前 PDF 标记和联系的还是稍微有些不满意,接下来有空可能看看 pdf-noter org-noter。不过这是个迭代的过程,先解决目前最想解决的,比如说我之前就是通过 org-mode 管理文献(代办),接下来应该是完善 org 笔记(org-roam)之类的,收集估计很长一段时间我应该都交给 zotero。

我也用过 devonthink,还是不太习惯。

只文献的话建议 zotero

zotero收录文献+管理pdf,自建webdav存储pdf,修改zotero-better-bibtex使输出bib文件包含collection和timestamp信息。

ebib + helm-bibtex 作为emacs端界面,ebib中可直接按collection或时间排列,可选择pdf-tools或者外部程序打开pdf,或者打开note文件。

org-noter 作笔记,笔记文件直接作为zotero附件,自动同步。ebib和helm-bibtex中可显示有note的文献条目。

org-ref 引用文献,可对链接直接打开pdf,使用helm-bibtex作为选择界面。

核心在于bib文件,zotero是输入,emacs这边为输出。

还有这两天在折腾的pdfgrep和ripgrep-all,直接搜索pdf内容,可选择搜索已打开的pdf文件或者zotero数据库。

4赞

zotero 文件管理的功能有点弱,我对文件管理以外的功能都不感兴趣。查了下 Yep 看起來可以,考慮到价格的话 Mendeley 可能也行,但对 online feature 无感。

需要什么文件管理的功能?搜索和tagging吗

我觉得如果只是管理bib文件的话,ebib已经是很好用了,特别是作者十几年如一日维护这个包,实在让人肃然起敬。

2赞

类似的有 EagleFiler和Yojimbo。

1赞

可以参考下这里怎么改么,或者给个🔗️

另外请教下这里是怎么做到的,我现在用 org-ref,所有笔记都在一个文件中。

基本的搜索和 tagging 其实用 macOS 自带的就有了。

我有几个特殊的要求,一个是能在读取 PDF 自带 metadata 以外自定义 summary,和搜索 summary 內容,出于习慣我会把下載的原文件名保留,而且除了另外对下載来扫描件或从 djvu 格式 dump 出来的做 OCR 之类的优化不会修改。标记已读和未读,最好和一般的 tagging 区分出来。还有一个是可以不以具体的名字做 tagging,或者至少要能统一修改一个 tag 的名字,对 tag 本身也要能分类。

1赞

这个 macOS 文件的 comment 应该可以实现?(通过 spotlight 可以搜到)

macOS 还有个 label 的标签(需要通过 AppleScript 修改),可能可以用来作为标记已读和未读,不过显示上还是和 tag 类似(可自选六种颜色)

这个 macOS 是支持的呀

不太会js,自己摸索弄得,我这边没问题。zotero-better-bibtex选项->高级->postscript,填入

if (Translator.BetterBibTeX) {
    if (item.accessDate) {
        reference.add({ name: 'timestamp', value: item.accessDate });
    }
    else {
        reference.add({ name: 'timestamp', value: item.dateAdded });
    }

    if (item.collections.length>0) {
        var collection_names;
        let each_collection;
        for (var key in item.collections) {
            each_collection = Object.values(Translator.collections).filter(collection => collection.key==item.collections[key]);
            if (each_collection.length>0) {
                if (collection_names) {
                    collection_names += ','+each_collection[0].name;
                }
                else {
                    collection_names = each_collection[0].name;
                }
            }
        }
        if (collection_names) {
            reference.add({ name: 'collection', value: collection_names, enc:'raw'});
        }
        else {
            reference.add({ name: 'collection', value: 'None' });
        }
    }
    else {
        reference.add({ name: 'collection', value: 'None' });
    }
}

笔记其实就是把note文件添加到zotero,作为一个单独条目,好久之前弄得,好像是New item下store copy of file。zotero会把note文件放在storage下一个单独的文件夹内,跟其他pdf附件相同。

1赞