Zotero と LaTeX Workshop で bib ファイルを扱いこなす

# Zotero と LaTeX Workshop で bib ファイルを扱いこなす

Zotero から簡単に bib ファイルを取得したい。また、LaTeX Workshop で上手に bib ファイルを取り扱いたい。

:::note info
- [Zotero](https://www.zotero.org/) **ver.5.0.96.2** **（2021/7 現在）**
- [LaTeX Workshop \| James Yu](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop) **ver.8.19.2** **（2021/7 現在）**
:::

本記事では、BibTeX や biber を利用した引用文献の出力カスタマイズについては一切述べない。bib ファイルを上手に扱うことのみに限る。

本記事は大きく以下のような構成となっている。

- [Bib ファイルの基礎知識](#-bib-ファイルの基礎知識)
- [Zotero から bib ファイルのエクスポート](#-zotero-から-bib-ファイルのエクスポート)
- [LaTeX Workshop によるフォーマット](#-latex-workshop-によるフォーマット)

また、LaTeX Workshop によるインテリセンス機能については [\# この節](#-インテリセンス) を参照されたい。

2 つ目の節は Zotero に関しているが、その他の節は bib ファイルの作成方法に依らない。Zotero 以外で作成している場合であっても一読の価値はあると思われる。

## ○ Bib ファイルの基礎知識

文献リストを手動で作成する場合、thebibliography 環境を使って作成することになる。この場合、文献の並び替えやスタイルをすべて手動で変更する必要があり非常に面倒になる。これを自動化するツールが BibTeX になる。このリストに必要な情報は bib ファイルに記述する。
本節ではこの bib ファイルについての基本的な記述方法を確認しておきたい。

1 つの文献は bib ファイル内で以下のような形式で記述される。

```bibtex
@EntryType{Citation_key,
  Fields = {Contents_of_fields},
}
```

本記事では bib ファイル内の要素を以下の 4 つの名前を利用していく。（さまざまな呼び方がるため、一般的な呼び名が分からなかった）

|       Contents       | Example elements                 | Description                        |
| :------------------: | :------------------------------- | :--------------------------------- |
|     `EntryType`      | `article`, `book` ...etc         | 文献の形式                         |
|    `Citation_key`    | Any key name                     | `\cite` で文献参照する際の参照キー |
|       `Fields`       | `title`, `author`, `year` ...etc | 文献の諸情報を記載                 |
| `Contents_of_fields` | -                                | タイトルや著者名など               |

`Fields` と `Contents_of_fields` からなる key-value については以下のような記法を満たす必要がある。

- `Fields` 名は大文字小文字を問わない（`EntryType` も同様）
- `Fields` 要素を同不順に列挙可能
- `=` の後に続けて `Contents_of_fields` を `{}` または `"` で囲う
- 行末尾には `,` を付ける
- `EntryType` ごとに必須の `Fields` がある（これらが揃っていないとエラーになる）


コメントアウトするには `@` を取り除けば良い。引用文献全体をコメントアウト出来るが、`Fields` のそれぞれをコメントアウトすることは出来ないようだ。

```bibtex
EntryType{Citation_key,
  Fields = {Contents_of_fields},
}
```

最後に具体例として、乾燥したパスタを 2 つに割る方法について示した「Controlling fracture cascades through twisting and quenching」の BibTeX ソースを示しておく。

> [1802.05402 \| arXiv](https://arxiv.org/abs/1802.05402)<br> arXiv の `Export Bibtex Citation` から BibTeX ソースを出力することが出来る。これを下で示している LaTeX Workshop でフォーマットを行った。

```bibtex
@article{Heisser_2018,
  title     = {Controlling fracture cascades through twisting and quenching},
  author    = {Heisser, Ronald H. and Patil, Vishal P. and Stoop, Norbert and Villermaux, Emmanuel and Dunkel, Jörn},
  year      = {2018},
  journal   = {Proceedings of the National Academy of Sciences},
  publisher = {Proceedings of the National Academy of Sciences},
  doi       = {10.1073/pnas.1802831115},
  issn      = {1091-6490},
  month     = {Aug},
  number    = {35},
  pages     = {8665–8670},
  url       = {http://dx.doi.org/10.1073/pnas.1802831115},
  volume    = {115},
}
```

このように記述する必要があるが、今回は自力で記述せずに Zotero から出力することを考えたいので詳細な記述方法についてはこれ以上述べない。
また、Zotero の他にも Google Scholar 等からでも bib 情報を得ることが出来る。

このような bib ファイルを作成したのちに、BibTeX や (u)pBibTeX, biber+BibLaTeX などのエンジンを利用して処理すれば LaTeX の処理に組み込むことが出来る。このような処理や引用文献の表示の並び替えなどの方法については他の記事を参照してほしい。
本記事は bib ファイルを上手に扱うことのみに限っている。（繰り返し注意喚起）

## ○ Zotero から bib ファイルのエクスポート

Zotero の初期設定については以下の記事の通りにしたものとしている。
この記事では Chrome 拡張機能から Zotero にインポートし、インポートした PDF ファイルを ZotFile を利用して Dropbox へ保存するようにしている。

> [Zotero で論文管理してみた話 - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/39dfbf3059aaf0690761)

文献引用したい文献はインポートしたのちに特定のコレクションに振り分けておくと良いだろう。（Zotero ではコレクションと呼称しているが、タグ付けに近い印象）

Zotero から BibTeX を作成する方法は非常に簡単。
例えば次のように必要な文献が “use” コレクションにある場合を考える。このコレクション上で右クリックし、` コレクションをエクスポート ` をクリックすると左のようなウィンドウが表示される。これを `OK` して bib ファイルを好きなところに保存すれば良いだけ。

|          Step1: Collection in Library          |             Step2: Export Window              |
| :--------------------------------------------: | :-------------------------------------------: |
| ![Zotero Export BibTeX of Collection][library] | ![Zotero BibTeX Export Window][export-window] |

[library]: https://i.gyazo.com/484a839a943c986498e6c8f5875317c3.png
[export-window]: https://i.gyazo.com/1aac1695ddae561236c7f6a53ee80b32.png

ここで画像をよく見るとしれっとフォーマットが Better BibTeX によるエクスポートになっている。
本記事で Better BibTeX (BBT) を利用できるようにしておこう。BBT を利用することで以下のようなメリットを得る。

- 日本語文献に対しても出力が安定する
- `Citation_key` のスタイルを変更できる
- 出力する `Fields` を制限できる

もちろん BBT を必ず利用する必要はないが、`Citation_key` を好きなようにカスタマイズすることにはかなり価値があると思われる。

### ■ Better BibTeX for Zotero

Zotero の拡張機能である Better BibTeX (BBT) を導入することでより良い bib ファイルを得ることが出来る。

:::note info
[Better BibTeX for Zotero](https://retorque.re/zotero-better-bibtex/) **ver.5.4.25** **（2021/7 現在）**
:::

BBT の取得方法は以下ページ内の latest release をクリック、GitHub の release ページに遷移するのでここから xpi ファイルをダウンロードすれば良い。

> [Installation :: Better BibTeX for Zotero](https://retorque.re/zotero-better-bibtex/installation/)

あとは ZotFile と同様に、メニューバーから ` ツール > アドオン ` に進み、右上の歯車アイコンから `Install Add-on From File` をクリックし、取得した zotero-better-bibtex ファイルを選択する。
インストールしたら Zotero を再起動する。おそらく 2 回ほど再起動する必要があるが、2 回とも再起動のダイアログが表示されるためそれに従えば良い。

#### Citation key の命名規則

> [Citation Keys :: Better BibTeX for Zotero](https://retorque.re/zotero-better-bibtex/citing/)

`Citation_key` をカスタムしたい。デフォルトでは以下のようになっている。

```
[auth:lower][shorttitle3_3][year]
```

この命名規則を例をもって示しておきたい。例えば、著者名が `Famous Author`、文献タイトルが `This is very famous document`、公開年が `1990` であれば `Citation_key` は以下のようになる。

```
famousThisIsVery1990
```

これらの詳細は以下を参照すると良い。かなり多様な設定をすることが出来ることが分かるだろう。

> *cf*. [Citation Keys # Functions :: Better BibTeX for Zotero](https://retorque.re/zotero-better-bibtex/citing/#functions)

今回は、Google Scholar 風の `Citation_key` を作成することを考えたい。BBT の issue に以下のようなものが挙がっていたので、これを参考にしたい。

> [Google Scholar like Citation Key Generation \- Issue \#595 \| retorquere/zotero-better-bibtex \- GitHub](https://github.com/retorquere/zotero-better-bibtex/issues/595)

issue によれば、以下のようにすれば Google Scholar 風になるようだ。

```
[auth:lower][year][veryshorttitle:lower]
```

このように変更するには、` 編集 > 設定 (N) ` から以下のような Zotero 環境設定ウィンドウを開く。`Better BibTeX` を選択し、ここから `Citation keys` タブの*Citation key format* を上のものに変更すれば良い。

<img src = "https://i.gyazo.com/549ee4315e1a36137fe2c4ef1ff18af8.png" width = "80%" alt = "Renaming Citaion keys">

## ○ LaTeX Workshop によるフォーマット

LaTeX Workshop では bib ファイルのフォーマットを行うことが出来る。これは latexindent を利用したフォーマットではなく、この拡張機能固有のフォーマットになっている。
これらはコマンドパレットから実行する。（頻繁に利用しないと予想されるのでショートカットキーは設定しない）

|                        Command Palette                         | Description               |
| :------------------------------------------------------------: | :------------------------ |
|        Sort BibTeX file<br> `"latex-workshop.bibsort"`         | 文献と `Fields` の並び替え |
|       Align BibTeX file<br> `"latex-workshop.bibalign"`        | `Fields` の `=` を整列     |
| Sort and Align BibTeX file<br> `"latex-workshop.bibalignsort"` | 上の 2 つを同時に実行       |

これらのコマンドの有効化は以下の設定を変更する必要がある。デフォルトではすべて `false` になっている。有効にしたいものを `true` にすれば良いだろう。

```jsonc
  // 文献の並び替えの有効化の切り替え
  "latex-workshop.bibtex-format.sort.enabled": false,
  // Fields の並び替えの有効化の切り替え
  "latex-workshop.bibtex-fields.sort.enabled": false,
  // Fields の整列の有効化の切り替え
  "latex-workshop.bibtex-format.align-equal.enabled": false,
```

また、これらのコマンドを実行した場合、以下で見る [\# 基本的なフォーマット](#-基本的なフォーマット) も同時に実行される。

以下に BibTeX に関する設定をまとめておく。

<details>
<summary>settings.json（折りたたみ）</summary>
<div>

```jsonc
{
    "[bibtex]": {
      "editor.wordWrap": "off",
      "editor.tabSize": 2,
      "editor.insertSpaces": true,
      "files.trimTrailingWhitespace": true,
    },
    // Intellisense for BibTeX
    "latex-workshop.intellisense.citation.maxfilesizeMB": 5,
    "latex-workshop.intellisense.citation.label": "title",
    "latex-workshop.intellisense.citation.type": "inline",
    "latex-workshop.intellisense.citation.format": [
      "author",
      "title",
      "journal",
      "publisher",
      "booktitle",
      "year"
    ],
    // Basic format settings
    "latex-workshop.bibtex-format.tab": "2 spaces",
    "latex-workshop.bibtex-format.case": "lowercase",
    "latex-workshop.bibtex-format.surround": "Curly braces",
    "latex-workshop.bibtex-format.trailingComma": true,
    "latex-workshop.bibtex-format.handleDuplicates": "Comment Duplicates",
    // Align "="
    "latex-workshop.bibtex-format.align-equal.enabled": true,
    // Sort fields
    "latex-workshop.bibtex-fields.sort.enabled": true,
    "latex-workshop.bibtex-fields.order": [
      "title",
      // writer
      "author",
      "editor",
      // date
      "year",
      // organization
      "journal",
      "publisher",
      "school",
      "institution",
    ],
    // Sort bib order
    "latex-workshop.bibtex-format.sort.enabled": true,
    "latex-workshop.bibtex-format.sortby": [
      "key"
    ],
}
```

</div>
</details>



### ■ 基本的なフォーマット

> コマンドパレットから"Sort and Align BibTeX file" する様子
>
> ![Format bib file](https://i.gyazo.com/e09be05ccad5ada9c8a34fa0ac788a01.gif)

基本的なフォーマット設定は以下からすることが出来る。ここで設定したフォーマットは上のコマンドのいずれかを実行すると動作する。

```jsonc
  "[bibtex]": {
    "editor.wordWrap": "off",
    "editor.tabSize": 2,
    "editor.insertSpaces": true,
    "files.trimTrailingWhitespace": true,
  },
  "latex-workshop.bibtex-format.tab": "2 spaces",
  "latex-workshop.bibtex-format.case": "lowercase",
  "latex-workshop.bibtex-format.surround": "Curly braces",
  "latex-workshop.bibtex-format.trailingComma": true,
  "latex-workshop.bibtex-format.handleDuplicates": "Highlight Duplicates",
```

インデントは `"editor.tabSize"`、`"editor.insertSpaces"` と `"~.bibtex-format.tab"` を揃えておく必要があるだろう。上の設定では半角スペース 2 つをインデントとしている。

この他は以下のような設定となっている。


|        Settings        | Value                                                                                                                                            | Description                     |
| :--------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ |
|       `"~.case"`       | <ul><li> 小文字：`"lowercase"`</li><li> 大文字：`"UPPERCASE"`</li></ul>                                                                          | `Fields` 名のレターケースを選択 |
|     `"~.surround"`     | <ul><li> 波括弧：`"Curly braces"`</li><li> ダブルクォテーション：`"Quotation marks"`</li></ul>                                                   | `Contents_of_fields` の囲い     |
|  `"~.trailingComma"`   | `true` or `false`                                                                                                                                | 末尾の `,` の自動挿入           |
| `"~.handleDuplicates"` | <ul><li> 波下線：`"Highlight Duplicates"`</li><li> コメントアウト：`"Comment Duplicates"`</li><li> なにもしない：`"Ignore Duplicates"`</li></ul> | 重複する `Citation_key` の処理  |


`"~.handleDuplicates"` では、同じ `Citation_key` があった場合に波下線が付くようにしている。Zotero から BibTeX をエクスポートする場合にはほとんど生じないと思われるが、場合によっては気にしておいた方が良いだろう。

### ■ 文献と Fields の並び替え

`"~.bibtex-format.sort.enabled"` を `true` とするとデフォルトでは `Citation_key` による並び替えとなる。（`"key"` が意味している）

```jsonc
  "latex-workshop.bibtex-format.sort.enabled": true,
  "latex-workshop.bibtex-format.sortby": [
    "key"
  ],
```

`"~.bibtex-format.sortby"` から `title` や `author` を複数含めて並び替えることも出来るが、`Citation_key` による並び替えで十分だろう。また、これらの bib ファイル内での並び替えは PDF に出力する際の並び替えとは全く関係がないので注意が必要。

また、`Fields` の順序を並び替えることが出来る。以下のようにしておけば必須 `Fields` を先に並べることが出来、目に優しくなるだろう。

```jsonc
  "latex-workshop.bibtex-fields.sort.enabled": true,
  "latex-workshop.bibtex-fields.order": [
    "title",
    // writer
    "author",
    "editor",
    // date
    "year",
    // organization
    "journal",
    "publisher",
    "school",
    "institution",
  ],
```

ここで指定しなかった `Fields` 名は指定した `Fields` 以下でアルファベット順になるようだ。

### ■ インテリセンス

BibTeX から `\cite` で引用する際にインテリセンスによって `Citation_key` が自動補完される。プリアンブルで `\bibliography{hoge.bib}` や `\addbibresource{hoge.bib}` などとすると LaTeX Workshop が bib ファイルを読むようになる。

デフォルトでは以下のようになっている。

```jsonc
  "latex-workshop.intellisense.citation.maxfilesizeMB": 5,
  "latex-workshop.intellisense.citation.label": "bibtex key",
  "latex-workshop.intellisense.citation.type": "inline",
  "latex-workshop.intellisense.citation.format": [
    "author",
    "title",
    "journal",
    "publisher",
    "booktitle",
    "year"
  ],
```

これらの設定の概要は以下のようになっている。


|      Settings       | Value                                                                                                     | Description                            |
| :-----------------: | :-------------------------------------------------------------------------------------------------------- | :------------------------------------- |
| `"~.maxfilesizeMB"` | numeric                                                                                                   | 読み込む BibTeX の最大サイズ           |
|     `"~.label"`     | <ul><li> タイトル：`"title"`</li><li> 著者名：`"author"`</li><li>`Citation_key`：`"bibtex key"`</li></ul> | サジェストを表示するためのトリガー語句 |
|     `"~.type"`      | <ul><li> ホバー表示：`"inline"`</li><li> ナビゲーション表示：`"browser"`</li></ul>                        | サジェストの表示位置                   |
|    `"~.format"`     | いくつかの `Fields`                                                                                       | サジェスト表示時の情報リスト           |

`\cite` で文献の参照を作成するとき、`Citation_key` を一言一句暗記して打つことに意味はない。サジェスト表示させて選択した方が便利。

多くの場合、参考文献で覚えているのは文献タイトルになると思われる。そのため、`"~.label"` は `"title"` にしておくと良いように思われる。

またこれは好みの問題だが、サジェストの表示位置は `"inline"` の方が見やすいと思われる。ホバーのサイズが小さくてすべての表示が出来ていない場合にはマウスで大きさを変更できる。以下の画像で確認してみてほしい。

|              Browser              |              Inline              |
| :-------------------------------: | :------------------------------: |
|   ![Citation key browser][ckb]    |   ![Citation key inline][cki]    |
| ![Citation key browser pic][ckbp] | ![Citation key inline pic][ckip] |

[cki]: https://i.gyazo.com/5d82980e498ece827c52b28e6ff02e2f.gif
[ckb]: https://i.gyazo.com/46e003ba0aab5a4954e4948e9a451e7b.gif
[ckbp]: https://i.gyazo.com/e4f34b790fe4953356c9b97609830150.png
[ckip]: https://i.gyazo.com/7e8e632eb2ef75b5ff0b8b7f9bad3d95.png

これらのインテリセンスはかなり優秀に働いてくれる。そのため、[mblode.zotero \- Marketplace][mblobe.zotero] などの Zotero から直接 `Citation_key` を取得する拡張機能もあるが、bib ファイルを作成してしまえば LaTeX Workshop のインテリセンスで十分だと思われる。（Zotero を起動させておく必要があることなどあまり勝手いが良いものとも思えなかった）

[mblobe.zotero]: https://marketplace.visualstudio.com/items?itemName=mblode.zotero

これらのインテリセンスに加えて `\cite{Citation_key}` に対してホバーで概要を見ることも出来る。

> ![Hover cite](https://github.com/James-Yu/LaTeX-Workshop/blob/master/demo_media/hover-cite.gif?raw=true)
> > *cf*. https://github.com/James-Yu/LaTeX-Workshop/blob/master/demo_media/hover-cite.gif?raw=true

# 参考

- About BibTeX
  - [Bibtex Entry Types, Field Types and Usage Hints](https://www.openoffice.org/bibliographic/bibtex-defs.html)
  - [Format - BibTeX.com](https://www.bibtex.com/format/)
  - [BibTeX Format Description \- BibTeX\.org](http://www.bibtex.org/Format/)
- LaTeX Workshop
  - [Format \- LaTeX-Workshop \| GitHub \- Wiki](https://github.com/James-Yu/LaTeX-Workshop/wiki/Format#Bibtex-files)
- Better BibTeX for Zotero
  - [Better BibTeX for Zotero :: Better BibTeX for Zotero](https://retorque.re/zotero-better-bibtex/)
  - [Google Scholar like Citation Key Generation \- Issue \#595 \| retorquere/zotero-better-bibtex \- GitHub](https://github.com/retorquere/zotero-better-bibtex/issues/595)

また、以下のページでは BibTeX の `EntryType` と `Field` に関して詳細に書かれている。スタイルのサンプルもある。

> [Format - BibTeX.com](https://www.bibtex.com/format/)

## 関連記事

Zotero に関する記事があります。本記事と合わせてご覧ください。

- [Zotero で論文管理してみた話 - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/39dfbf3059aaf0690761)

    > Zotero をセットアップします。

# 余談

bib ファイルを取り扱うだけならかなり簡単に扱えるようになっていると思われる。
LaTeX Workshop の設定はほとんどがデフォルトのままになっているが、どのようなフォーマット機能やインテリセンス機能があるのか把握しておく必要はあるだろうと思う。

BibTeX による文献の出力形式をカスタマイズするのは少し面倒らしい。
基本的には (u)pBibTeX を利用すれば良いと思われる。すこし複雑なカスタムをしたい場合には biber+biblatex を利用すると楽に出来るらしい。（最近まで biblatex がエンジンだと思っていたが、これはパッケージ。バックエンドのエンジンに biber や BibTeX を利用しているらしい。）

<!--
BibTeX のフォーマットの GIF 画像や PNG 画像は自ら作成した。LaTeX Workshop の Wiki 内で画像がなかったためである。
スクリーンショットは Gyazo から行った。また、VSCode の設定から screencast モードを有効にすると打ったキーボードショートカットを表示してくれるのでより分かりやすくなったと思われる。
-->

LaTeX Workshop に関連する記事を計 4 本書いたが、これで Docker に関する設定以外はほぼ網羅したと思われる。やったね！

## BibTeX に関するエトセトラ

追記に付すくらいには小さい記事にしようと思ったら、想像以上に大きい記事になってしまったので、以下の Gist に書きました。

> [初心者のための BibTeX とは \- Gist](https://gist.github.com/Yarakashi-Kikohshi/986bb23547866e32c8916b81099a470a)

タイトルの対象が大きすぎてそれに耐えうる記事かは怪しいです。

# 追記

- 2021/08/08 : 軽微修正。
- 2022/07/15 : 軽微修正。