「Zotero」の版間の差分

提供:Turgenev's Wiki
(Notion-MW)
(Notion-MW)
1行目: 1行目:
文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。
文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。


== 初期設定 ==
==初期設定==


Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては [https://note.com/sdeso/n/n013952313c1b 【令和最新版】文献管理ソフト Zoteroのすゝめ|SD|note] が大変詳しく、これでほぼ十分であるが、いくつか追加しておく。
Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては[https://note.com/sdeso/n/n013952313c1b【令和最新版】文献管理ソフトZoteroのすゝめ|SD|note]nmd_mw_mark_linkが大変詳しく、これでほぼ十分であるが、いくつか追加しておく。


* Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると(アドオンと混同されて)「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。
*Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると(アドオンと混同されて)「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。
* ファイルの自動命名は日本人だと苗字がLast Nameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。
*ファイルの自動命名は日本人だと苗字がLastNameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。
* コレクションごとにフォルダ分けしたい場合は、”Use subfolder defined by”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする(この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける)。参考:[https://dr-kayai.hatenablog.com/entry/2020/02/09/234427 Zoteroの使い方(我流、逐次更新) - Bag of ML Words]など
*コレクションごとにフォルダ分けしたい場合は、”Usesubfolderdefinedby”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする(この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける)。参考:[https://dr-kayai.hatenablog.com/entry/2020/02/09/234427Zoteroの使い方(我流、逐次更新)-BagofMLWords]nmd_mw_mark_linkなど


=== ブラウザ拡張の使い方など ===
===ブラウザ拡張の使い方など===


ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbedded Metadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。
ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbeddedMetadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。


ブラウザ拡張を経由せずに(ローカルにあるpdfを)入れるときは、ZoteroのウインドウにD&D(このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される(移動になる))して取り込む。日本語論文などで文献情報がうまく読まれない場合は、Manual Entryを作成するしかない場合もあるが、J-STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある(pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい)。
ブラウザ拡張を経由せずに(ローカルにあるpdfを)入れるときは、ZoteroのウインドウにD&D(このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される(移動になる))して取り込む。日本語論文などで文献情報がうまく読まれない場合は、ManualEntryを作成するしかない場合もあるが、J-STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある(pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい)。


ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRename Attachmentsをする必要がある。なお(最初のサイトで推奨されている通り)”<strong>サブコレクションからアイテムを表示</strong>”がonだと特定コレクションの中身(サブコレクション内部を含め)すべてに対してRename Attachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う(あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる)。なお、前述のようにクラウドストレージのフォルダをLocation of Filesに指定して同期している場合、Rename Attachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。
ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRenameAttachmentsをする必要がある。なお(最初のサイトで推奨されている通り)”<strong>サブコレクションからアイテムを表示</strong>”がonだと特定コレクションの中身(サブコレクション内部を含め)すべてに対してRenameAttachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う(あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる)。なお、前述のようにクラウドストレージのフォルダをLocationofFilesに指定して同期している場合、RenameAttachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。


また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRename and moveを実行し、適宜ゴミ箱に移動して(アイテムを)削除し、DELETEフォルダの中身も定期的に削除する、とやっている。
また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRenameandmoveを実行し、適宜ゴミ箱に移動して(アイテムを)削除し、DELETEフォルダの中身も定期的に削除する、とやっている。


== dateデータのフォーマットについて ==
==dateデータのフォーマットについて==


Zotero Connectorはサイトやpdfから論文の投稿(掲載?)日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月 22 , 2011」、英語であれば「April 22, 2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011&#45;04&#45;22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。
ZoteroConnectorはサイトやpdfから論文の投稿(掲載?)日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月22,2011」、英語であれば「April22,2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011&#45;04&#45;22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。


本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、Better BibTeXの使用時に問題が発生していた(後述)。
本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、BetterBibTeXの使用時に問題が発生していた(後述)。


<span id="better-bibtex-for-zotero-nmd_mw_mark_link"></span>
<spanid="better-bibtex-for-zotero"></span>
== [https://retorque.re/zotero-better-bibtex/ <strong>Better BibTeX for Zotero</strong>] ==
==[https://retorque.re/zotero-better-bibtex/<strong>BetterBibTeXforZotero</strong>]nmd_mw_mark_link==


まずは普通に[https://retorque.re/zotero-better-bibtex/ Better BibTeX for Zotero]からxpiをインストール、再起動すると再びdrag&#45;and&#45;dropを有効にするため再起動しろと言われるので再起動する。Citation keyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。[https://qiita.com/skrb_hs/items/73061b7a8e39f1e73e0d Zotero+BibTeXで参考文献の出力を自動化&amp;論文の引用で出てきた順にソートする]の通り、export→fieldsのfields to omit from exportにabstract,file,doiと書く。[https://plaza.umin.ac.jp/shoei05/wp/index.php/2020/10/31/206/ Zotero で citation keys を設定する ( zotero&#45;better&#45;bibtex ) &#45; shoei05]の通りCitation keysを&#91;auth&#58;lower&#93;&#91;year&#93;&#91;shorttitle1_1&#93;に変更する。
まずは普通に[https://retorque.re/zotero-better-bibtex/BetterBibTeXforZotero]nmd_mw_mark_linkからxpiをインストール、再起動すると再びdrag&#45;and&#45;dropを有効にするため再起動しろと言われるので再起動する。Citationkeyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。[https://qiita.com/skrb_hs/items/73061b7a8e39f1e73e0dZotero+BibTeXで参考文献の出力を自動化&amp;論文の引用で出てきた順にソートする]nmd_mw_mark_linkの通り、export→fieldsのfieldstoomitfromexportにabstract,file,doiと書く。[https://plaza.umin.ac.jp/shoei05/wp/index.php/2020/10/31/206/Zoteroでcitationkeysを設定する(zotero&#45;better&#45;bibtex)&#45;shoei05]nmd_mw_mark_linkの通りCitationkeysを&#91;auth&#58;lower&#93;&#91;year&#93;&#91;shorttitle1_1&#93;に変更する。


Citation keyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える(これは設定で無効にできる)
Citationkeyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える(これは設定で無効にできる)


<span id="日本語文献のcitation-keyについて"></span>
<spanid="日本語文献のcitation-keyについて"></span>
==== 日本語文献のCitation Keyについて ====
====日本語文献のCitationKeyについて====


[https://qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977 https&#58;//qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977]
[https://qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977https&#58;//qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977]nmd_mw_mark_link


<span id="yearデータの不具合6760で修正済"></span>
<spanid="yearデータの不具合6760で修正済"></span>
==== yearデータの不具合(<u>6.7.60で修正済</u>) ====
====yearデータの不具合(<u>6.7.60で修正済</u>)====


参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April 22, 2011」「2011&#45;04&#45;22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月 22 , 2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX(.bib)に出力されてしまう(報告済み&#58; [https://github.com/retorquere/zotero-better-bibtex/issues/2449 &#91;Bug&#93;&#58; Japanese date format is not parsed correctly · Issue &#35;2449 · retorquere/zotero&#45;better&#45;bibtex]、6.7.61あたりで修正済み)。←の通り、Better BibTeXのエクスポート時に適用されるscript(Export → postscript)のところにデータを置換するための以下のようなコードを書いておくとよい。
参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April22,2011」「2011&#45;04&#45;22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月22,2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX(.bib)に出力されてしまう(報告済み&#58;[https://github.com/retorquere/zotero-better-bibtex/issues/2449&#91;Bug&#93;&#58;Japanesedateformatisnotparsedcorrectly·Issue&#35;2449·retorquere/zotero&#45;better&#45;bibtex]nmd_mw_mark_link、6.7.61あたりで修正済み)。←の通り、BetterBibTeXのエクスポート時に適用されるscript(Export→postscript)のところにデータを置換するための以下のようなコードを書いておくとよい。


<syntaxhighlight lang="vb.net">if (tex.has.year) {
<syntaxhighlightlang="python">vb.net
tex.add({name: 'year', replace: true, value: tex.has.year.value.replace(/.* /, '')})
if(tex.has.year){
tex.add({name:'year',replace:true,value:tex.has.year.value.replace(/.*/,'')})
}</syntaxhighlight>
}</syntaxhighlight>
設定箇所はこんな感じ↓
設定箇所はこんな感じ↓
49行目: 50行目:
<div class="res-img">https://turgenev.cloudfree.jp/mw1/imgs/zot-settings.jpg</div>
<div class="res-img">https://turgenev.cloudfree.jp/mw1/imgs/zot-settings.jpg</div>


* 今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった([https://github.com/retorquere/zotero-better-bibtex/issues/2447 https://github.com/retorquere/zotero-better-bibtex/issues/2447])。
*今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった([https://github.com/retorquere/zotero-better-bibtex/issues/2447https://github.com/retorquere/zotero-better-bibtex/issues/2447]nmd_mw_mark_link)。


<span id="zotero-protocolを使用した操作"></span>
<spanid="zotero-protocolを使用した操作"></span>
== Zotero Protocolを使用した操作 ==
==ZoteroProtocolを使用した操作==


{{Valuable}}
{{Valuable}}
58行目: 59行目:
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、<code>zotero&#58;//</code>という形式のURL(URIスキーム)を以下のように指定してZoteroを起動することができる(既に起動していた場合は、画面に変化が起こる)。
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、<code>zotero&#58;//</code>という形式のURL(URIスキーム)を以下のように指定してZoteroを起動することができる(既に起動していた場合は、画面に変化が起こる)。


<syntaxhighlight lang="python">zotero.exe -url "zotero://url/here"</syntaxhighlight>
<syntaxhighlightlang="python">python
zotero.exe-url"zotero://url/here"</syntaxhighlight>
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。


一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが [https://github.com/zotero/zotero/blob/master/components/zotero-protocol-handler.js zotero/zotero&#45;protocol&#45;handler.js at master · zotero/zotero] <code>scopeObject</code>などと書いてあるあたりをよく読むと、<code>zotero&#58;//select/library/collections/&#123;collection_key&#125;/items/&#123;item_key&#125;</code>という形式で指定すればよいことがわかる(groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである)。<code>collection_key</code>と<code>item_key</code>はどちらも<code>1A2B3C4D</code>のような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれ<strong>ID</strong>も割り当てられているがこちらは1~3桁くらいの数字でありkeyとは別なので注意。
一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが[https://github.com/zotero/zotero/blob/master/components/zotero-protocol-handler.jszotero/zotero&#45;protocol&#45;handler.jsatmaster·zotero/zotero]nmd_mw_mark_linkの<code>scopeObject</code>などと書いてあるあたりをよく読むと、<code>zotero&#58;//select/library/collections/&#123;collection_key&#125;/items/&#123;item_key&#125;</code>という形式で指定すればよいことがわかる(groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである)。<code>collection_key</code>と<code>item_key</code>はどちらも<code>1A2B3C4D</code>のような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれ<strong>ID</strong>も割り当てられているがこちらは1~3桁くらいの数字でありkeyとは別なので注意。


<span id="指定されたcitation-keyのアイテムをzoteroで開く"></span>
<spanid="指定されたcitation-keyのアイテムをzoteroで開く"></span>
== 指定されたCitation keyのアイテムをZoteroで開く ==
==指定されたCitationkeyのアイテムをZoteroで開く==


前述の方法を応用して実装してみる。ここではCitation keyとしてBetter BibTeXのものを使うことを仮定する。
前述の方法を応用して実装してみる。ここではCitationkeyとしてBetterBibTeXのものを使うことを仮定する。


まず、Citation keyからアイテムのキーを取得する部分を作る。Citation keyはBetter BibTeXが管理しているので(ここではデフォルトの&#126;/Zoteroに各種データがあると仮定して)&#126;/Zotero/better&#45;bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション(複数ある場合は最初のもの)のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。
まず、Citationkeyからアイテムのキーを取得する部分を作る。CitationkeyはBetterBibTeXが管理しているので(ここではデフォルトの&#126;/Zoteroに各種データがあると仮定して)&#126;/Zotero/better&#45;bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション(複数ある場合は最初のもの)のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。


Zoteroの起動中はデータベースファイルがロックされているが、[https://sqlite.org/forum/info/a2e9387b8ea1c919b2ad1ecafb417cebb15c48634c55b3abd6a9acbb2fabf797 SQLite Forum&#58; Option to open a database as read&#45;only despite locked.]にある通り、(Windowsなら)<code>sqlite3 &quot;file&#58;Zotero\\zotero.sqlite?mode&#61;ro&amp;nolock&#61;1&quot;</code>のようにしてやると読み取り専用で開くことはできる(書き込まないのでこれで充分)。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。
Zoteroの起動中はデータベースファイルがロックされているが、[https://sqlite.org/forum/info/a2e9387b8ea1c919b2ad1ecafb417cebb15c48634c55b3abd6a9acbb2fabf797SQLiteForum&#58;Optiontoopenadatabaseasread&#45;onlydespitelocked.]nmd_mw_mark_linkにある通り、(Windowsなら)<code>sqlite3&quot;file&#58;Zotero\\zotero.sqlite?mode&#61;ro&amp;nolock&#61;1&quot;</code>のようにしてやると読み取り専用で開くことはできる(書き込まないのでこれで充分)。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。


コード例&#58;
コード例&#58;


<syntaxhighlight style="margin-bottom:0.2em;" lang="python">import sqlite3
<syntaxhighlight style="margin-bottom:0.2em;"lang="python">python
import sys
importsqlite3
import json
importsys
import subprocess
importjson
db = sqlite3.connect('file:'+sys.argv[1]+'?mode=ro&nolock=1', uri=True)
importsubprocess
cur = db.cursor()
db=sqlite3.connect('file:'+sys.argv[1]+'?mode=ro&nolock=1',uri=True)
cur.execute('SELECT data FROM "better-bibtex" where name="better-bibtex.citekey"')
cur=db.cursor()
d = json.loads(cur.fetchone()[0])
cur.execute('SELECTdataFROM"better-bibtex"wherename="better-bibtex.citekey"')
mydict = {}
d=json.loads(cur.fetchone()[0])
for item in d["data"]:
mydict={}
    mydict[item["citekey"]] = item["itemKey"]
foritemind["data"]:
myKey = mydict[sys.argv[3]]
mydict[item["citekey"]]=item["itemKey"]
myKey=mydict[sys.argv[3]]


db2 = sqlite3.connect('file:'+sys.argv[2]+'?mode=ro&nolock=1', uri=True)
db2=sqlite3.connect('file:'+sys.argv[2]+'?mode=ro&nolock=1',uri=True)
cur2 = db2.cursor()
cur2=db2.cursor()
cur2.execute("SELECT itemID FROM items WHERE key=?", (myKey, ))
cur2.execute("SELECTitemIDFROMitemsWHEREkey=?",(myKey,))
item_id = cur2.fetchone()[0]
item_id=cur2.fetchone()[0]
cur2.execute("SELECT collectionID FROM collectionItems WHERE itemID=?", (item_id, ))
cur2.execute("SELECTcollectionIDFROMcollectionItemsWHEREitemID=?",(item_id,))
# 所属する最初のコレクションIDを取得
#所属する最初のコレクションIDを取得
collection_id = cur2.fetchone()[0]
collection_id=cur2.fetchone()[0]
# collectionIDからcollectionKeyを取得
#collectionIDからcollectionKeyを取得
cur2.execute("SELECT key FROM collections WHERE collectionID=?", (collection_id,))
cur2.execute("SELECTkeyFROMcollectionsWHEREcollectionID=?",(collection_id,))
collection_key =cur2.fetchone()[0]
collection_key=cur2.fetchone()[0]
print(collection_key)
print(collection_key)
subprocess.run(f'"C:\Program Files (x86)\Zotero\zotero.exe" -url "zotero://select/library/collections/{collection_key}/items/{myKey}')
subprocess.run(f'"C:\ProgramFiles(x86)\Zotero\zotero.exe"-url"zotero://select/library/collections/{collection_key}/items/{myKey}')
db.close()
db.close()
db2.close()</syntaxhighlight>
db2.close()</syntaxhighlight>
<div style='text-align: center;'>zoto.py</div>
<divstyle='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>
<syntaxhighlightlang="python">c#
* [[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]と組み合わせれば、選択文字列をCitation keyとするアイテムを一発で開くことも可能。
python"path\to\zoto.py""%USERPROFILE%\Zotero\better-bibtex.sqlite""%USERPROFILE%\Zotero\zotero.sqlite"%1</syntaxhighlight>
*[[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]nmd_mw_mark_linkと組み合わせれば、選択文字列をCitationkeyとするアイテムを一発で開くことも可能。


== その他 ==
==その他==


アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。
アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev's Wiki}}
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}}-Turgenev'sWiki}}

2025年4月2日 (水) 18:33時点における版

文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。

初期設定

Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては[1]nmd_mw_mark_linkが大変詳しく、これでほぼ十分であるが、いくつか追加しておく。

  • Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると(アドオンと混同されて)「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。
  • ファイルの自動命名は日本人だと苗字がLastNameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。
  • コレクションごとにフォルダ分けしたい場合は、”Usesubfolderdefinedby”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする(この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける)。参考:[2]nmd_mw_mark_linkなど

ブラウザ拡張の使い方など

ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbeddedMetadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。

ブラウザ拡張を経由せずに(ローカルにあるpdfを)入れるときは、ZoteroのウインドウにD&D(このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される(移動になる))して取り込む。日本語論文などで文献情報がうまく読まれない場合は、ManualEntryを作成するしかない場合もあるが、J-STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある(pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい)。

ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRenameAttachmentsをする必要がある。なお(最初のサイトで推奨されている通り)”サブコレクションからアイテムを表示”がonだと特定コレクションの中身(サブコレクション内部を含め)すべてに対してRenameAttachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う(あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる)。なお、前述のようにクラウドストレージのフォルダをLocationofFilesに指定して同期している場合、RenameAttachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。

また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRenameandmoveを実行し、適宜ゴミ箱に移動して(アイテムを)削除し、DELETEフォルダの中身も定期的に削除する、とやっている。

dateデータのフォーマットについて

ZoteroConnectorはサイトやpdfから論文の投稿(掲載?)日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月22,2011」、英語であれば「April22,2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011-04-22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。

本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、BetterBibTeXの使用時に問題が発生していた(後述)。

<spanid="better-bibtex-for-zotero">

BetterBibTeXforZoteronmd_mw_mark_link

まずは普通に[3]nmd_mw_mark_linkからxpiをインストール、再起動すると再びdrag-and-dropを有効にするため再起動しろと言われるので再起動する。Citationkeyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。[4]nmd_mw_mark_linkの通り、export→fieldsのfieldstoomitfromexportにabstract,file,doiと書く。[5]nmd_mw_mark_linkの通りCitationkeysを[auth:lower][year][shorttitle1_1]に変更する。

Citationkeyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える(これは設定で無効にできる)

<spanid="日本語文献のcitation-keyについて">

日本語文献のCitationKeyについて

[6]nmd_mw_mark_link

<spanid="yearデータの不具合6760で修正済">

yearデータの不具合(6.7.60で修正済)

参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April22,2011」「2011-04-22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月22,2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX(.bib)に出力されてしまう(報告済み:[7]nmd_mw_mark_link、6.7.61あたりで修正済み)。←の通り、BetterBibTeXのエクスポート時に適用されるscript(Export→postscript)のところにデータを置換するための以下のようなコードを書いておくとよい。

<syntaxhighlightlang="python">vb.net if(tex.has.year){ tex.add({name:'year',replace:true,value:tex.has.year.value.replace(/.*/,)}) }</syntaxhighlight> 設定箇所はこんな感じ↓

zot-settings.jpg
  • 今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった([8]nmd_mw_mark_link)。

<spanid="zotero-protocolを使用した操作">

ZoteroProtocolを使用した操作

このセクションに含まれる情報は比較的貴重なものである可能性があります。

ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、zotero://という形式のURL(URIスキーム)を以下のように指定してZoteroを起動することができる(既に起動していた場合は、画面に変化が起こる)。

<syntaxhighlightlang="python">python zotero.exe-url"zotero://url/here"</syntaxhighlight> URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。

一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが[9]nmd_mw_mark_linkのscopeObjectなどと書いてあるあたりをよく読むと、zotero://select/library/collections/{collection_key}/items/{item_key}という形式で指定すればよいことがわかる(groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである)。collection_keyitem_keyはどちらも1A2B3C4Dのような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれIDも割り当てられているがこちらは1~3桁くらいの数字でありkeyとは別なので注意。

<spanid="指定されたcitation-keyのアイテムをzoteroで開く">

指定されたCitationkeyのアイテムをZoteroで開く

前述の方法を応用して実装してみる。ここではCitationkeyとしてBetterBibTeXのものを使うことを仮定する。

まず、Citationkeyからアイテムのキーを取得する部分を作る。CitationkeyはBetterBibTeXが管理しているので(ここではデフォルトの~/Zoteroに各種データがあると仮定して)~/Zotero/better-bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション(複数ある場合は最初のもの)のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。

Zoteroの起動中はデータベースファイルがロックされているが、[10]nmd_mw_mark_linkにある通り、(Windowsなら)sqlite3"file:Zotero\\zotero.sqlite?mode=ro&nolock=1"のようにしてやると読み取り専用で開くことはできる(書き込まないのでこれで充分)。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。

コード例:

python
importsqlite3
importsys
importjson
importsubprocess
db=sqlite3.connect('file:'+sys.argv[1]+'?mode=ro&nolock=1',uri=True)
cur=db.cursor()
cur.execute('SELECTdataFROM"better-bibtex"wherename="better-bibtex.citekey"')
d=json.loads(cur.fetchone()[0])
mydict={}
foritemind["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("SELECTitemIDFROMitemsWHEREkey=?",(myKey,))
item_id=cur2.fetchone()[0]
cur2.execute("SELECTcollectionIDFROMcollectionItemsWHEREitemID=?",(item_id,))
#所属する最初のコレクションIDを取得
collection_id=cur2.fetchone()[0]
#collectionIDからcollectionKeyを取得
cur2.execute("SELECTkeyFROMcollectionsWHEREcollectionID=?",(collection_id,))
collection_key=cur2.fetchone()[0]
print(collection_key)
subprocess.run(f'"C:\ProgramFiles(x86)\Zotero\zotero.exe"-url"zotero://select/library/collections/{collection_key}/items/{myKey}')
db.close()
db2.close()

<divstyle='text-align:center;'>zoto.py

上記コードは以下のように起動できる。

<syntaxhighlightlang="python">c# python"path\to\zoto.py""%USERPROFILE%\Zotero\better-bibtex.sqlite""%USERPROFILE%\Zotero\zotero.sqlite"%1</syntaxhighlight>

その他

アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。