90
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Notionでの論文管理をサポートするツールを作りました

Last updated at Posted at 2023-06-11

変更履歴

231108
現在、Pythonのバージョンが3.12だとpipでのインストールに失敗することがあるようです。
バージョン3.10または3.11のPythonを使うのがオススメです。
詳細を記載しました。
インストールの失敗について、ご報告いただきありがとうございました。

230614
Notionデータベース作成の方法に誤りがあったため修正しました。
Firstプロパティも、Selectタイプにする必要があります。
ご指摘ありがとうございました。

前置き

私はこんな感じでNotionを使って論文の管理をしているのですが、
その際に使っているPythonプログラムをコマンドラインツールとしてまとめて、配布してみました。

その名も Papnt です。

所詮素人が作ったプログラムなので大目に見てください。
このプログラムを使った結果について、一切責任は取れません。

なにができるの?

  • Notionデータベースに論文DOIを入力→papnt doi→論文の詳細な情報がデータベースに追加されている!
  • Notionデータベースに論文PDFをアップ→papnt pdf→論文の詳細な情報がデータベースに追加されている!
  • papnt paths (論文PDFのパス)→論文の詳細な情報がデータベースに追加されている!
  • Notionデータベースのうち引用したい論文にタグをつける→papnt makebib→bibファイルが作られている!

以下は使い方です。

Notion側の準備

データベース作成

特定の名前・タイプをもったプロパティから成る、空のデータベースを作ります。
以下の手順に従うと、比較的簡単にできあがります。

まず、以下をコピーし、Notionのどこかのページにペーストしてください。

|Name|First|Year|PDF|Journal|Type|Authors|Title|Cite in|Citekey|Edition|Publisher|Volume|Issue|Pages|Subject|DOI|HowPublished|info|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
||Select|Number|Files & media|Select|Select|Multiselect||Multiselect|||Select||||Multiselect|||Checkbox|

シンプルテーブルが作られるはずです。
このシンプルテーブルについて、OptionからHeader row(行見出し)をオンにします。

header-row-on.png

右角の3点ボタンから、Turn into database(データベースに変換)します。

turn-into-db.png

1行目に書かれているとおりのプロパティタイプに変更していってください。
たとえば、Yearの列には「Number」と書かれているので、プロパティタイプをNumberにしてください。

edit-type.png

1行目に何も書いていない列(プロパティ)はTextタイプのままにしておいてください。
この作業が終わったら、一行目は削除してしまってください。

これで論文情報を記入するデータベースが完成しました。

ここで作った以外のプロパティを持たせても大丈夫です。
例えば、ページを生成した日付などのプロパティがあると便利です。
プロパティの表示順や、表示・非表示設定は自由です。

プロパティの名前を変えていただくこともできます。
しかし、設定のために一手間かかるのでいったんこの名前のまま進めましょう。

make-database.png

Notion APIとの接続

作成したデータベースを、Notion APIで操作できるように設定してください。
詳細は、「Notion API データベース」あたりでググってください。
TokenkeyとDatabase IDを取得し、作成したIntegrationをデータベースにadd connectionできればOKです。

addconn.png

データベースをインライン表示している場合はご注意ください。
インラインでデータベースを埋め込んでいるページのIDではなく、データベースそのもののIDを取得する必要があります。

データベースの左上の::をクリックして、Open as pageしてからTokenkey、IDの取得、add connectionをしましょう。

openaspage.png

Papntのインストール

pipでインストール

ご自身でPython環境をお持ちでしたら、以下のコマンドでインストール完了です。

% pip3 install git+https://github.com/issakuss/papnt.git@main

いくつかのパッケージがご使用の環境にインストールされるのでご注意ください。
また、Python >= 3.10 が必要です。

現在、Python3.12を使用していると、pipでのインストールに失敗することがあるようです。
3.10か、3.11を使うのがオススメです。

詳細

PDFからDOIを読み取るのにpdf2doiというパッケージを使っています。
このパッケージはPyMuPDF==1.21.0のインストールを指定しています。
(https://github.com/MicheleCotrufo/pdf2doi/blob/master/requirements.txt)
ところが、Python3.12用のwheelは、PyMuPDF==1.23.5まで用意されていないようです。
(https://github.com/pymupdf/PyMuPDF/issues/2723)
そのためPython3.12からですと、sdistを用いてPyMuPDFをインストールすることになります。
この場合、VisualStudioなど、あれこれとソフトが必要になるようです。
(https://github.com/pymupdf/PyMuPDF/issues/2037)

Homebrewでインストール

macOSをご使用でしたら、Homebrewを使って以下のコマンドでインストールするのがオススメです。

% brew install issakuss/papnt/papnt

Python環境ごとインストールするので、面倒なことを考える必要がありません。
ただし、インストールに少々時間がかかります。
私の環境だと6分ほどかかりました。

Papntの設定

papntとだけ打って実行すると、以下のようなメッセージが出ます。

message.png

表示されたパスにあるconfig.iniを、テキストエディットやメモ帳など、お手元のエディタで開いてください。
以下のように表示されるはずです。

config.ini
[database]
    tokenkey = ''
    database_id = ''

[propnames]  ; Propety Names
    ; bib name = property name
    ; Check bib names: https://ja.wikipedia.org/wiki/BibTeX
    ; Note that bib names will be used as lower case
    doi = DOI
    author = Authors
    title = Title
    edition = Edition
    year = Year
    journal = Journal
    volume = Volume
    pages = Pages
    publisher = Publisher
    ID = Citekey
    ENTRYTYPE = Type
    howpublished = HowPublished

    ; Other property
    output_target = Cite in
    pdf = PDF

[abbr]  ; Specifiation of abbreviation
    Full Name = Abbreviated
    PLOS ONE = PLOS ONE

[misc]
    ; Directory to save bib files
    dir_save_bib = ''

必須項目

以下の2項目には、それぞれNotionデータベースにアクセスするためのTokenkeyとDatabase IDを入力してください。

config.ini
[database]
    tokenkey = secret_vjaQgg2FGGjfaFQFGgagafFgjoiHffaefHFfaeKeeLs
    ; ↑こんな感じのsecret_から始まる50桁です(適当に作った例です)
    database_id = ac4ss3gajfhkga887fav2343tgggaq34
    ; ↑こんな感じの32桁です(適当に作った例です)

さらに、以下にbibファイルの保存先を指定してください。

config.ini
[misc]
    ; Directory to save bib files
    dir_save_bib = ''

以下は例です。

config.ini
[misc]
    ; Directory to save bib files
    dir_save_bib = /Users/issakuss/Desktop

プロパティ名の設定

もしプロパティの名前を変更する場合は、[propnames]を編集してください。
たとえば、Authorsというプロパティ名をChosyaに変えたい場合は、

    author = Chosya

としてください。

コマンドの実行

Terminalなりコマンドプロンプトなりでコマンドを打って使用してください。

papnt doi

データベースに記入されたDOIをもとに、情報を埋めるコマンドです。

これを使うにはまず、データベース内のページにDOIを記入します。

enter-doi.png

papnt doiを実行すると、自動で論文情報が入力されます。

info-filled-doi.png

情報が埋められると、infoというプロパティに自動でチェックがつきます。
papnt doiは、DOIに入力があり、かつinfoにチェックがついていないページを探します。
そしてヒットしたすべてのページの情報を、入力されたDOIをもとに埋めます。

より詳細な挙動
  1. Notion APIでデータベースを取得します。
  2. そこから、DOIに入力があり、かつinfoにチェックがついていないページを探します。
  3. ヒットしたすべてのページにおいて、入力されたDOIをもとに論文情報を収集します。
    DOIから論文情報を収集するのには、crossrefapiを使います。
  4. 収集した論文情報をNotion Propertyの形に整えます。
  5. Notion APIを使ってデータベースに反映させます。

papnt pdf

データベースにアップロードされたPDFファイルをもとに、情報を埋めます。

これを使うにはまず、データベース内のページにPDFファイルをアップロードします。
up-pdf.png

papnt pdfを実行すると、自動で論文情報が入力されます。
papnt doiと同様、PDFにファイルがあり、かつinfoにチェックがついていないページを探します。
そしてヒットしたすべてのページの情報を、PDFに書かれたDOIをもとに入力します。

PDFからDOIを抽出できない場合があります。
その際は手動でDOIをコピーして、papnt doiを使用してください。
誤ったDOIに基づいて情報入力してしまうこともあるのでご注意ください。

より詳細な挙動
  1. Notion APIでデータベースを取得します。
  2. そこから、PDFにファイルがあり、かつinfoにチェックがついていないページを探します。
  3. PDFファイルを"you-can-delete-this-file.pdf"という名前でダウンロードします。
    このファイルは自動的に削除されます。
  4. pdf2doiを用いてDOIを抽出します。
  5. 以降はpapnt doiの挙動3以降と同様です。

papnt paths

ローカルにある論文PDFファイルのパスを指定すると、その論文の情報をデータベースに追加します。

以下のようにして、論文PDFファイルのパスを指定して実行します。

papnt paths /Users/issakuss/Downloads/sample1.pdf

すると、データベースにページが追加され、情報が入力されます。
PDFのアップロードまではされません。
NotionのAPIに、ファイルアップロード機能がないためです。

複数のファイルをカンマで区切って入力することで、複数の論文をいっぺんに追加することもできます。

papnt paths /Users/issakuss/Downloads/sample2.pdf,/Users/issakuss/Downloads/sample3.pdf
より詳細な挙動
  1. 入力されたファイルパスをカンマで区切ります。
  2. それぞれのパスに対して、papnt pdfの挙動4以降と同様の処理をします。

papnt makebib

特定のタグをつけた論文からbibファイルを作成するコマンドです。

これを使うにはまず、bibファイルに含めるページのCite inプロパティに任意のタグをつけます。
たとえば、next-paperというタグをつけてみましょう。
別のタグ(たとえばlatest-paper)がついていても問題ありません。

enter-citein.png

続いて、以下のコマンドを打ちます。

% papnt makebib next-paper

しばらくすると、next-paper.bibという名前でファイルが生成されます。
保存先は、config.iniファイルで指定したディレクトリです。

より詳細な挙動
  1. Notion APIでデータベースを取得します。
  2. そこから、指定されたタグのついたページを探します。
  3. ページに書いてある論文情報をもとにbibファイルを生成します。

さらに、同じディレクトリにnext-paper.jsonというファイルも生成されます。
これには、生成したbibファイルに含まれるすべてのジャーナル名の略称情報が含まれています。

next-paper.json
{
  "default": {
    "container-title": {
      "Frontiers in Psychology": "Front. Psychol.",
      "Scientific Reports": "Sci. Rep."
    }
  }
}

たとえばPandocなら、--citation-abbreviationsオプションを使用してこのjsonファイルを指定することで、省略したジャーナル名を参考文献リストに記載することができます。

一部、省略がうまくいかないことがあります。
たとえば「PLOS ONE」が、「PLO ONE」になったりします。
そういったジャーナル名に対応するためには、config.iniに手動で省略形を記載してください。

config.ini
[abbr]  ; Specifiation of abbreviation
    Full Name = Abbreviated
    PLOS ONE = PLOS ONE

左に省略前のジャーナル名、右に省略後のジャーナル名を書いてください。
jsonファイルの生成に反映されます。

より詳細な挙動
  1. 生成されたbibファイルを読み込みます。
  2. bibファイルに含まれるジャーナル名の一覧を作ります。
  3. 各ジャーナル名について、iso4を使って省略名を生成します。
  4. config.iniによって指定されている省略名があれば、それをもって上書きします。
  5. jsonファイルとして出力します。

(おまけ)PDFを副クリックしてNotionデータベースに追加

macOS限定です。

まず、こちらのサイトからGet File Path.actionをDLしてインストールしてください。

ポップアップに従って「他社製のAutomatorアクションを有効にする」にチェックすることが求められます。
私の環境だとなぜかチェックができない(チェックボックスが反応しない)のですが、
Automatorアプリを開き、メニューバー→Automator→他社製のAutomatorアクション… でなんとかなりました。

私の環境だとさらにセキュリティに弾かれたのですが、Terminalから

sudo spctl --master-enable

でなんとかなりました。
一時的にセキュリティが弱められるので、使い方等よくググってからお試しください。

add-pdfs-to-notion-db.workflow.zipをDLして、解凍してください。
workflowファイルをダブルクリックしてインストールしてください。

その後適当な論文PDFを副クリックすると、クイックアクションにNotionDBに追加が加わっているはずです。

add-notion-db.png

これを実行してみてうまくいくようならそれでOKです。
「command not found: papnt」的なエラーが出ましたら、papntのPATHを設定してやる必要があります。
エラーメッセージにあるワークフローを表示ボタンを押して、NotionDBに追加.workflowをAutomatorで編集しましょう。

automator.png

シェルスクリプトを実行の項目に注目。
初期設定で、PATH=/opt/homebrew/bin:$PATHとなっています。
/opt/homebrew/binにpapntがないと「command not found: papnt」となります。

ご自身の環境のどこにpapntがあるかを調べるために、ターミナルを開いてwhich papntをします。
これで出てきたパスから、最後のpapntを除いて.workflowファイルを書き換えてください。

たとえば、which papntしたときに
/opt/homebrew/Caskroom/miniconda/base/envs/papnt/bin/papnt
と表示されたなら、

スクリーンショット 2023-06-08 16.38.30.png

こうです。

大目に見てください

macOSでのみ動作チェックしたので、Windowsでもうまく動くか未確認です。
もっといろんな環境で確認してからリリース(?)しようかと思ったのですが、
いつまで経っても世に出せなさそうだったので見切り発車です。
うまく動かない旨ご報告いただければ、できるだけ対応します。
時間はかかります。

パソコンに被害を及ぼしうるようなシロモノではないと思うのですが、
所詮シロウトのプログラムなのでご警戒ください。
ご不安であれば、ご自身でコード読み取っていただいて、
使えそうな部分だけピックアップするような形ででも使ってください。

pdf2doiの限界などのために、誤った論文情報を持ってくるようなことはしばしばあります。
論文情報が正しいかどうか、必ずご自身でご確認ください。 

90
66
12

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
90
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?