「Zotero」の版間の差分
(Notion-MW) |
(Notion-MW) |
||
42行目: | 42行目: | ||
参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April 22, 2011」「2011-04-22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月 22 , 2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX(.bib)に出力されてしまう(報告済み: [https://github.com/retorquere/zotero-better-bibtex/issues/2449 [Bug]: Japanese date format is not parsed correctly · Issue #2449 · retorquere/zotero-better-bibtex]、6.7.61あたりで修正済み)。←の通り、Better BibTeXのエクスポート時に適用されるscript(Export → postscript)のところにデータを置換するための以下のようなコードを書いておくとよい。 | 参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April 22, 2011」「2011-04-22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月 22 , 2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX(.bib)に出力されてしまう(報告済み: [https://github.com/retorquere/zotero-better-bibtex/issues/2449 [Bug]: Japanese date format is not parsed correctly · Issue #2449 · retorquere/zotero-better-bibtex]、6.7.61あたりで修正済み)。←の通り、Better BibTeXのエクスポート時に適用されるscript(Export → postscript)のところにデータを置換するための以下のようなコードを書いておくとよい。 | ||
< | <syntaxhighlight lang="visual basic">if (tex.has.year) { | ||
tex.add({name: 'year', replace: true, value: tex.has.year.value.replace(/.* /, '')}) | tex.add({name: 'year', replace: true, value: tex.has.year.value.replace(/.* /, '')}) | ||
}</ | }</syntaxhighlight> | ||
設定箇所はこんな感じ↓ | 設定箇所はこんな感じ↓ | ||
58行目: | 58行目: | ||
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、<code>zotero://</code>という形式のURL(URIスキーム)を以下のように指定してZoteroを起動することができる(既に起動していた場合は、画面に変化が起こる)。 | ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、<code>zotero://</code>という形式のURL(URIスキーム)を以下のように指定してZoteroを起動することができる(既に起動していた場合は、画面に変化が起こる)。 | ||
< | <syntaxhighlight lang="python">zotero.exe -url "zotero://url/here"</syntaxhighlight> | ||
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。 | URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。 | ||
74行目: | 74行目: | ||
コード例: | コード例: | ||
< | m_with_cap_m | ||
<syntaxhighlight lang="python">import sqlite3 | |||
import sys | import sys | ||
import json | import json | ||
import subprocess | import subprocess | ||
db = sqlite3.connect('file:'+sys.argv[1]+'?mode=ro& | db = sqlite3.connect('file:'+sys.argv[1]+'?mode=ro&nolock=1', uri=True) | ||
cur = db.cursor() | cur = db.cursor() | ||
cur.execute('SELECT data FROM | cur.execute('SELECT data FROM "better-bibtex" where name="better-bibtex.citekey"') | ||
d = json.loads(cur.fetchone()[0]) | d = json.loads(cur.fetchone()[0]) | ||
mydict = {} | mydict = {} | ||
for item in d[ | for item in d["data"]: | ||
mydict[item[ | mydict[item["citekey"]] = item["itemKey"] | ||
myKey = mydict[sys.argv[3]] | myKey = mydict[sys.argv[3]] | ||
db2 = sqlite3.connect('file:'+sys.argv[2]+'?mode=ro& | db2 = sqlite3.connect('file:'+sys.argv[2]+'?mode=ro&nolock=1', uri=True) | ||
cur2 = db2.cursor() | cur2 = db2.cursor() | ||
cur2.execute( | cur2.execute("SELECT itemID FROM items WHERE key=?", (myKey, )) | ||
item_id = cur2.fetchone()[0] | item_id = cur2.fetchone()[0] | ||
cur2.execute( | cur2.execute("SELECT collectionID FROM collectionItems WHERE itemID=?", (item_id, )) | ||
# 所属する最初のコレクションIDを取得 | # 所属する最初のコレクションIDを取得 | ||
collection_id = cur2.fetchone()[0] | collection_id = cur2.fetchone()[0] | ||
# collectionIDからcollectionKeyを取得 | # collectionIDからcollectionKeyを取得 | ||
cur2.execute( | cur2.execute("SELECT key FROM collections WHERE collectionID=?", (collection_id,)) | ||
collection_key =cur2.fetchone()[0] | collection_key =cur2.fetchone()[0] | ||
print(collection_key) | print(collection_key) | ||
subprocess.run(f' | subprocess.run(f'"C:\Program Files (x86)\Zotero\zotero.exe" -url "zotero://select/library/collections/{collection_key}/items/{myKey}') | ||
db.close() | db.close() | ||
db2.close()</ | db2.close()</syntaxhighlight> | ||
<div style='text-align: center;'>zoto.py</div> | <div style='text-align: center;'>zoto.py</div> | ||
上記コードは以下のように起動できる。 | 上記コードは以下のように起動できる。 | ||
< | <syntaxhighlight lang="c#">python "path\to\zoto.py" "%USERPROFILE%\Zotero\better-bibtex.sqlite" "%USERPROFILE%\Zotero\zotero.sqlite" %1</syntaxhighlight> | ||
* [[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]と組み合わせれば、選択文字列をCitation keyとするアイテムを一発で開くことも可能。 | * [[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]と組み合わせれば、選択文字列をCitation keyとするアイテムを一発で開くことも可能。 | ||
2023年11月24日 (金) 11:07時点における版
文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。
初期設定
Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては 【令和最新版】文献管理ソフト Zoteroのすゝめ|SD|note が大変詳しく、これでほぼ十分であるが、いくつか追加しておく。
- Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると(アドオンと混同されて)「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。
- ファイルの自動命名は日本人だと苗字がLast Nameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。
- コレクションごとにフォルダ分けしたい場合は、”Use subfolder defined by”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする(この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける)。参考:Zoteroの使い方(我流、逐次更新) - Bag of ML Wordsなど
ブラウザ拡張の使い方など
ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbedded Metadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。
ブラウザ拡張を経由せずに(ローカルにあるpdfを)入れるときは、ZoteroのウインドウにD&D(このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される(移動になる))して取り込む。日本語論文などで文献情報がうまく読まれない場合は、Manual Entryを作成するしかない場合もあるが、J-STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある(pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい)。
ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRename Attachmentsをする必要がある。なお(最初のサイトで推奨されている通り)”サブコレクションからアイテムを表示”がonだと特定コレクションの中身(サブコレクション内部を含め)すべてに対してRename Attachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う(あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる)。なお、前述のようにクラウドストレージのフォルダをLocation of Filesに指定して同期している場合、Rename Attachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。
また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRename and moveを実行し、適宜ゴミ箱に移動して(アイテムを)削除し、DELETEフォルダの中身も定期的に削除する、とやっている。
dateデータのフォーマットについて
Zotero Connectorはサイトやpdfから論文の投稿(掲載?)日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月 22 , 2011」、英語であれば「April 22, 2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011-04-22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。
本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、Better BibTeXの使用時に問題が発生していた(後述)。
Better BibTeX for Zotero
まずは普通にBetter BibTeX for Zoteroからxpiをインストール、再起動すると再びdrag-and-dropを有効にするため再起動しろと言われるので再起動する。Citation keyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。Zotero+BibTeXで参考文献の出力を自動化&論文の引用で出てきた順にソートするの通り、export→fieldsのfields to omit from exportにabstract,file,doiと書く。Zotero で citation keys を設定する ( zotero-better-bibtex ) - shoei05の通りCitation keysを[auth:lower][year][shorttitle1_1]に変更する。
Citation keyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える(これは設定で無効にできる)
日本語文献のCitation Keyについて
https://qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977
yearデータの不具合(6.7.60で修正済)
参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April 22, 2011」「2011-04-22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月 22 , 2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX(.bib)に出力されてしまう(報告済み: [Bug]: Japanese date format is not parsed correctly · Issue #2449 · retorquere/zotero-better-bibtex、6.7.61あたりで修正済み)。←の通り、Better BibTeXのエクスポート時に適用されるscript(Export → postscript)のところにデータを置換するための以下のようなコードを書いておくとよい。
if (tex.has.year) {
tex.add({name: 'year', replace: true, value: tex.has.year.value.replace(/.* /, '')})
}
設定箇所はこんな感じ↓
- 今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった(https://github.com/retorquere/zotero-better-bibtex/issues/2447)。
Zotero Protocolを使用した操作
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、zotero://
という形式のURL(URIスキーム)を以下のように指定してZoteroを起動することができる(既に起動していた場合は、画面に変化が起こる)。
zotero.exe -url "zotero://url/here"
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。
一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが zotero/zotero-protocol-handler.js at master · zotero/zotero のscopeObject
などと書いてあるあたりをよく読むと、zotero://select/library/collections/{collection_key}/items/{item_key}
という形式で指定すればよいことがわかる(groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである)。collection_key
とitem_key
はどちらも1A2B3C4D
のような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれIDも割り当てられているがこちらは1~3桁くらいの数字でありkeyとは別なので注意。
指定されたCitation keyのアイテムをZoteroで開く
前述の方法を応用して実装してみる。ここではCitation keyとしてBetter BibTeXのものを使うことを仮定する。
まず、Citation keyからアイテムのキーを取得する部分を作る。Citation keyはBetter BibTeXが管理しているので(ここではデフォルトの~/Zoteroに各種データがあると仮定して)~/Zotero/better-bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション(複数ある場合は最初のもの)のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。
Zoteroの起動中はデータベースファイルがロックされているが、SQLite Forum: Option to open a database as read-only despite locked.にある通り、(Windowsなら)sqlite3 "file:Zotero\\zotero.sqlite?mode=ro&nolock=1"
のようにしてやると読み取り専用で開くことはできる(書き込まないのでこれで充分)。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。
コード例:
m_with_cap_m
import sqlite3
import sys
import json
import subprocess
db = sqlite3.connect('file:'+sys.argv[1]+'?mode=ro&nolock=1', uri=True)
cur = db.cursor()
cur.execute('SELECT data FROM "better-bibtex" where name="better-bibtex.citekey"')
d = json.loads(cur.fetchone()[0])
mydict = {}
for item in d["data"]:
mydict[item["citekey"]] = item["itemKey"]
myKey = mydict[sys.argv[3]]
db2 = sqlite3.connect('file:'+sys.argv[2]+'?mode=ro&nolock=1', uri=True)
cur2 = db2.cursor()
cur2.execute("SELECT itemID FROM items WHERE key=?", (myKey, ))
item_id = cur2.fetchone()[0]
cur2.execute("SELECT collectionID FROM collectionItems WHERE itemID=?", (item_id, ))
# 所属する最初のコレクションIDを取得
collection_id = cur2.fetchone()[0]
# collectionIDからcollectionKeyを取得
cur2.execute("SELECT key FROM collections WHERE collectionID=?", (collection_id,))
collection_key =cur2.fetchone()[0]
print(collection_key)
subprocess.run(f'"C:\Program Files (x86)\Zotero\zotero.exe" -url "zotero://select/library/collections/{collection_key}/items/{myKey}')
db.close()
db2.close()
上記コードは以下のように起動できる。
python "path\to\zoto.py" "%USERPROFILE%\Zotero\better-bibtex.sqlite" "%USERPROFILE%\Zotero\zotero.sqlite" %1
- Windowsのクリップボードを用いた選択コンテンツの取得と組み合わせれば、選択文字列をCitation keyとするアイテムを一発で開くことも可能。
その他
アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。