Published on

さようなら​Zotero, こんに​ちは​JabRef

tl;dr

主要OS間でいい感じに文献情報と実体ファイルを同期するにはお金を積むか苦労するかのどちらかだ。ZoteroからJabRefに移行してみたが、Bibファイルベースのワークフローはシンプルで事故りにくいから今のところ満足。

フルタイム研究者ではない者の文献管理

文献管理サービス・アプリは何を使っていますか?

私は奈良時代1からしばらくはMendeleyを、そしてこの記事を書くまではZoteroを使っていました。 Zoteroは、かつてはFirefoxの拡張で現在はスタンドアローンのアプリです。 Windows, macOS, Linux, iOSでも使えて、オープンソースであること、そしてUIが他の有料サービスと比べても(研究者ではなくソフトウェアエンジニアとして利用する分には)遜色ないものである良いアプリだと思っています。

定番のファイル管理機能拡張であるZotFileとクラウドストレージの組み合わせは、単一の管理環境であれば問題なかったのですが、Windows PCとmacOS環境の両方からZoteroを使っていると、文献情報のファイルリンク切れやファイルの増殖など、気になる点が増えてきました。 最近BOOX Note Air 3Cを買ったこともあり、何年間も見ないふりをしてきたものごとを整理したくなったため、ここ数年間お世話になったZoteroからJabRefへ移行してみました。

長ったらしいので、後半の「ハマったこと」や「Zotero + ZotFile環境からJabRefへの移行」だけ読めば終わる話です。

求めること, あるいはZotero + ZotFileのつらみ

それは結局ファイルの同期問題。

いわゆる研究者ポジションではなく、ソフトウェアエンジニアとして日銭を得ているので、文献管理機能自体に対して求める要件は少なめです。 普段は自分が関係する分野の文献を追って、たまに論文やテクニカルペーパーを書く、というぐらいの研究との関わり方です。 なので私が使うのはほとんどの場合Webからのインポート機能と、CSLに対応したBib(|La)TeX形式へのエクスポート機能ぐらいです。 ライブラリをリアルタイムで共同執筆者と共有したり、いい感じの引用グラフを作ったり、凝ったアノテーションを書き込める、というような機能は今のところ必要ない。

まとめるとこんな要件でしょうか。

論文自体を読みたいだけってことがほとんどだが、念のためちゃんと管理しておきたい。メタデータと実体ファイルの取り込みはブラウザ上でやりたい。読む環境は異なるかもしれないので、論文の実体ファイルは複数のOSやデバイスで同期したい。読むためのアプリはそれぞれの環境の汎用的なPDFリーダーで大丈夫。

現在でも論文のフォーマットは紙面と同じなので、読むのに適した環境と メタデータを管理しやすく執筆時に利用しやすい環境とは個人的には異なる気がします。 私の場合は読むときは高解像度のタブレット端末、できればe-Ink端末だとうれしいので、メタデータ管理はともかく実体のファイルはそうした環境に同期したい。 この、文献情報に紐づいた実体ファイルの安定した同期、という要件が文献管理環境の整備で苦労している原因です。

複数のデバイスを使い分けていると生じる問題

文献を見つけてブラウザからインポートする環境は、macOSやWindowsマシンです。 それぞれOneDriveなどのクラウドストレージサービスで同期できる状態にあります。 Zoteroでは、データベースやその他の設定ファイルは同期すると問題が生じうるので、それらの同期はZoteroのクラウドサービスで同期2し、PDFなどの "Attachments"(以下添付ファイル) はユーザー側のクラウドストレージで同期するのが良いと思います。 自然言語処理分野だけを追っていたころはギリギリ収まりそうでしたが、ここ数年はコンピュータビジョン分野の論文も読むようになったので、全然収まらなくなりました。

Zoteroでは、(なんでそういう設計かは自分はわかりませんが)文献情報や添付ファイルといった "Item" はTop-level itemかそうでないかという違いがあります。 基本的には、文献情報それ自体を表すitemの下に、その文献のPDFファイルやWebページのスナップショットなどのAttachmentが属する形にしておきます。 Zoteroの画面上に並ぶ行にPDFファイル単体があったら後々困るので、そのファイルを入れるための文献情報を作成して、それにファイルを紐づけておきます。

Zoteroはデフォルトの状態ではデータベースや設定が置かれている "Data Directory" 内に添付ファイルの実体を保存します3。Zoteroのクラウドサービスでファイルも同期する場合や、Zotero以外で論文のファイルを触ることがない場合は、これで十分かもしれません。

一方、添付ファイル自体は別のディレクトリにまとめて管理したい場合は、"Linked Attachmentいう形式で扱うことができ、"Preferences -> Advanced -> Files and Folders -> Linked Attachment Base Directory" を設定することで分離できます。 Linked Attachmentは "Base Directory" からの相対パスとなっているので、環境が変わっても問題なく機能する、はずです。

このあたりの作業はZoteroの機能拡張である ZotFile を使うのが便利です。 指定したパターンでのリネームを行いつつ、同期用のクラウドストレージ管理下のディレクトリにファイルを移動することができます。その他いろいろできるようですが、自分はこの機能のために使っています。 とても便利なのですが、後に書くようにハマりどころももたらします。

さて、インポートしたり管理したりする側と異なり、私の場合は文献を読むデバイスはiPadやBOOXのようなiOS, Androidデバイスです。 クラウドストレージサービスのアプリが対応していたとしても、ファイルシステムに対するアクセスには制限がある環境です。 そもそも、数千件のPDFファイルを同期したとして、ビューワーで所望のファイルを見つけ出すこと自体がUX的に厳しいかもしれません。

やりたいこととハマったことの整理

いったん整理しましょう。 以下の手持ちのデバイス・環境間で、文献の実体ファイルを同期したいという要件です。文献メタデータのDBはPC系の環境でのみ同期できていれば問題ないです。

  • メタデータDBも同期する
    • 私用Windows 11 PC
    • 社用macOS
  • 文献ファイル(主にPDF)を同期する
    • iPadOS (iPad Pro)
    • Android (BOOX e-Ink tablet)

これを実現するために使用していた環境はこのようなものです。

  • 文献管理ソフトウェア: Zotero
  • メタデータDB同期: Zotero標準のWeb Library同期機能
  • 文献ファイル同期: iCloud Drive, OneDrive
  • 同期用の文献ファイル整理: ZoteroのLinked File機能とZotFileによる機械的なリネーム・移動

生じていた問題を挙げます。

  • 全部ZotFileで移動させたつもりができていない
  • ZotFileでリネームしようとしたらTop-level itemじゃないと怒られた
  • Send to TabletをmacOSとWindowsからやってしまうと狂う
  • Send to Tabletでファイルがダブる
  • ファイルだけじゃなくてTop-levelの文献情報も増殖する
  • iCloud Driveのせいなのかファイル自体がダブる

以下では、これらの問題をZotero + ZotFile構成で解決するのを諦めてJabRefに移行してなんとかしました。

移行するかしないか、移行するなら何に移行するか

はじめに書いたようにReadCubeなどの全盛り有料サービスは使用しない縛りです。 移行先に対する要件はこんなものです。

  • 無償、できればOSSだと嬉しい
  • 文献管理アプリ自体はmacOS, Windows, Linux対応
  • モバイルアプリがiOSのみ、Androidのみという場合もあるので、モバイルアプリはなくてよい
  • 主要クラウドストレージ上のディレクトリを複数のデバイスで使える4
    • たとえば、指定ディレクトリからの相対パスで指定する方式をとっている
  • (そもそも当然だが)BibTeX, BibLaTeX形式でのエクスポートが可能

Perplexityに聞いたらおすすめされたのでJabRefを試してみることにしました。

ZoteroからJabRefへ

Zotero + ZotFile環境で生じた文献情報や実体ファイルの重複やリンク切れを対処しながらJabRefに移行します。 やったことはシンプルで、Zoteroの重複エントリ検索機能である程度文献情報の重複を排除してから、Better BibTeXではなく標準機能でBibLaTeX形式で {library_name}.bib をエクスポートして、そのファイルに記載されたファイルを整理したというだけです。

試行錯誤をしていて生じたことは以下に箇条書きします。すんなりできればよかったのですが。

  • エクスポートする形式はBibLaTeX形式
    • EndNote XMLはファイルパスだけ編集するのにParserを考えなくてよいので楽そうだったが、JabRef側がインポートできなくてダメだった
    • Better BibTeX でBibLaTeX形式で出力しようとするものの、ライブラリに含まれるレコード数が2800ぐらいだからなのかOOMエラーで失敗する。現在Preview版のZotero 7では解消する、またはキャッシュをクリアするとよい という情報はあるものの、手元では解消しなかった。
    • Zotero標準のExporterでBibLaTeX形式でエクスポートするが、一見役立ちそうな "Export files" オプションを有効にすると、Data Directoryのように {numericId}/{filename} となってしまい、他のアプリから非常に使いにくいため、そのオプションは使わずにLinked Attachmentの状態でExportしておく
    • JabRefで開くまえに、末尾に2.pdf みたいになってしまっているファイル5を掃除して、ファイルパスも修正しておく
      • 心配なのでVSCodeで開いて (?<=file = \{.+)\d\.pdf.pdf に一括置換
      • ディレクトリ内の末尾 [0-9].pdf ファイルを.pdf にリネーム
      #!/bin/bash
      # Find all PDF files that have a digit before the .pdf extension
      find . -type f -name '*[0-9].pdf' | while read file; do
          # Use mv to rename the file by removing the digit before the .pdf extension
          mv "$file" "${file%[0-9].pdf}.pdf"
      done
      

それぞれの環境(macOSとWindows環境)でJabRefをセットアップして、上記で色々整えたbibファイルを開きます。 JabRefでは "Linked files" という設定項目があり、bibエントリに紐づけるファイルのパスの起点を設定できます。 前段でファイルのパスを相対パスで記述しているので、"Main file directory" (起点となるディレクトリ)を指定すれば複数の環境で問題なく開くことができます。

なお、複数のbibファイル(JabRefのライブラリ)を管理していて特定のものだけ指定したい場合は、JabRef全体の設定ではなくライブラリの設定から指定します。

優先順位はドキュメントに記載されています。 JabRef v5 Docs: Manage associated files

JabRef uses these 3 directories to search for the files: JabRef starts in the user-specific file directory, then the general file directory, and, finally, the main file directory​ ....... JabRef enables setting a directory per database. When sharing a library across multiple persons, each user might have a different directory. Either, each user can set his directory in the "Main file directory". In case the group also shares papers and thus there are two directories (the private one and a group-shared one), one can set a directory within the library (the "General file directory"). In case a user has a different location of the shared folder (e.g., different paths on Linux and Windows), he can use the "User-specific file directory". This setting is persisted in the bib file in a way that it does not overwrite the setting of another user. For this, JabRef uses the username of the currently logged-in user (-<loginname> is used as a suffix in the jabref-meta field). So, both mary and aileen can set a different user-specific file directory.

結果、BOOXで快適な論文読みライフに

温かみのある手作業(シェルコマンドとエディタでの編集)を経て、無事にJabRefに移行できました。 最後に、論文を読むときに使用するBOOX Note Air 3Cでの設定や操作方法を紹介します。

BOOX Note Air 3CはカスタムのAndroid 12を採用しています。 書棚管理アプリはクラウドストレージとの連携機能をもち、Dropbox, Google Drive, OneDriveなどに対応しています。 先に設定したクラウドストレージ上のディレクトリを書棚管理アプリで開き、所望のファイルを選択すればPDFリーダー(NeoReader)が開きます。 最近のBOOX端末はGoogle Playストアに対応しているので他のリーダーアプリも使えますが、BOOX標準リーダーはe-Ink端末向けにカスタマイズされていて使い勝手もよく、特に不満はないです。

マーカーを引いたり手書きのメモを追加したりしたあとは、メニューから "Embed Data" を選択すると、自動的にクラウドストレージに同期されます。

ePubなどPDF以外の形式ではこのような簡単な同期には未対応らしいので、Playストアから入れたクラウドストレージアプリなどから適宜手動で同期します。

こんな感じで、論文の管理から読むところまでは無事に環境を整えることができました。

今のところ足りていないところとしては、JabRefのChrome拡張がZoteroに比べて使い勝手が良くない点や、BOOXやiPadのような端末上で2000件を超えるファイルがあるディレクトリ内で読みたいものを見つけるときにタイトル検索ぐらいしか効率化の手がないということでしょうか。 そのへんはまた時間をつくって改善しようと思います。

Footnotes

  1. 奈良先端科学技術大学院大学に在籍していたころ、を奈良時代と呼ぶ習わしがある(ない)。

  2. 無料でも1GBまでファイルを含めて同期できます。それを超過する場合は有料となります。この記事では有料プランのことは扱いません。

  3. この状態を "Stored FIle" と呼ぶらしいです。

  4. それなりの量のPDFファイルがありほとんどのクラウドストレージサービスの無料枠では収まらないため、実は有料プランをサブスクしています。ここは他の用途でも使えるので無料縛りはなしです。

  5. 添付ファイルの増殖はZotFileの機能のひとつであるタブレットとの同期機能 ("Send to tablet") によるものです。想定されているユースケースでは、Zotero上で"Send to tablet"を実行すると、Linked Attachmentを他の端末との同期対象のディレクトリにコピーしてくれます。そのファイルを再取り込みする際に安全のために元のファイルを上書きしない挙動がある様子です。