BibTexを使用するメリットとその使用方法

# Bibtexの使い方

この文書では，$\rm\LaTeX$で参考文献リストを作成するためのツールとしてBibTex(+Mendelay, latexmk)の使用法を紹介する．
大量の参考文献を参照する場合や似た分野で何度も文書を作成するときに有効である．
（作業環境はintel macを想定しているが，殆どの場面でOSによる問題は発生しない．）

## Bibtexを使うメリット

普通，$\rm\TeX$で参考文献を作成する方法として，`\thebibliography`を使用する方法もある．
`\thebibliography`とは，文書ごとに参考文献リストを自分で作成し，それに参照ラベルを割り当てて文書内で引用する方法となる．
この方法は，自分が作成したとおりの文献リストが文書に反映されるため，直感的に使用しやすい反面，以下のような使いづらさがある．

1. 文書ごとに毎回文献リストを作成する必要がある．
2. 参考文献の引用方法スタイル（参考文献をどの順番で並べるかや，イタリック，ボールドなどの使い分け，doiを入れるかなど情報の取捨選択）を変更したい場合も自力で変更しなければならない．
3. 文書を作成している途中では，どれを参考文献として引用するか確定していないため，文献リストを作りづらい，また最終的に変更しようと思っていても忘れる．

これらのデメリットを克服できるのがBibtexとなっている．

1. 一度引用する可能性のある文献のリスト（bibファイル）を作成すれば，**他の文書でも使い回せる**．
2. スタイルファイルを指定するだけで，参考文献の**引用方法スタイルを簡単に変更可能**．
3. 本文中で引用されているもののみが参考文献として出力されるため，**文書作成途中でも引用リストを簡単に作れる**．

## Bibtexの使用方法

### bibファイルの用意

文献のデータをまとめておくbibファイルを用意する．
bibファイルは以下の内容となっている．

```bib
@article{bibtex2000,
author = {Lastname, Firstname and Lastname, Firstname and ...},
doi = {00.0000/0000-000/00000},
journal = {Journal Name},
number = {0},
pages = {0--0},
title = {Journal title},
volume = {0},
year = {2000}
}
```

- ```@article```が文献の種類を指定，```@inproceeding```や```@book```など，文献の種類によって変更する．
- ```@article```の横に書いているやつ（上だと`bibtex2000`）がcitation keyとなっており，この名前を本文中で用いて引用する．
- ```author```に著者情報を書き込む．```性, 名 and 性, 名 and ...```という少し特殊な書き方をする．ミドルネームなどは```名```の方にまとめて書く．
- ```journal```に論文誌を書く．
- ```volume```, ```number```, ```pages```にそれぞれvolume, number, pagesを書く（ちなみに，複数ページの場合は```pages = {1--10}```というふうに```--```を用いる．Texでは`-`はハイフンで`--`はendashとして出力される．）
- `title`にタイトルを書く．出力される際，先頭以外の大文字以外は小文字で出力されるので，大文字のまま出力したいものは`{}`でくくって記入する．

必須で書かないといけないのがこれらの項目である．
追加で`doi`とか`month`とか`abstract`とかも書ける．
`@inproceeding`（学会誌）では論文誌の代わりに`publisher`や`city`を書いたり，`@book`では```volume```, ```number```, ```pages```が必要ないなどの違いがある（最後に必須項目とそれ以外の項目の表をまとめる）．

## Tex文書本体の書き方

thebibliographyを使用する際と同じく，本文中で`\cite{bibtex2000}`といったふうに書けば引用される（ちなみに`\usepackage{cite}`を文書の最初に書いておけば，`\cite{A,B,C}`と複数同時箇所で引用した際に自動で番号順に並び替えて引用される）．

文書の最後に取り込むbibファイルの指定と引用スタイルの指定する．
例えば，同じディレクトリにlibrary.bibという文献ファイルを作成し，できるだけ省略した形式で引用したい場合次のように書く．

```tex
%参考文献の取り込み（library.bibというファイルが存在する場合）
\bibliography{library}

%参考文献出力スタイル, abbrv, plain, 
\bibliographystyle{abbrv}
```

スタイルの種類やその仕上がりについては[[BibTeX] スタイルファイルのレイアウトサンプル](https://www.okomeda.net/wp/504/)を参考．
基本的には`abbrv`か`unsrt`（英語），もしくは`jabbrv`か`junsrt`（日本語）で良い．
学会によってはスタイルファイルが配られることもある．

## コンパイル方法

普通のplatexのコンパイル方法ではbibファイルは読み込まれず，bibtexを取り込んだりなど複数回コンパイルする必要がある．
めんどくさいので，latexmkで自動コンパイルするのがおすすめ（手動でやりたい方は他のサイトを調べてください）．

文書のあるディレクトリに，latexmkrcという名前で以下のファイルを作成する．

```perl:latexmkrc
#!/usr/bin/perl
$latex         = 'platex %O -halt-on-error -file-line-error -interaction=nonstopmode -synctex=1 -kanji=utf8 %S';
$bibtex        = 'pbibtex %O %B -kanji=utf8';
$dvipdf        = 'dvipdfmx %O -o %D %S';
$pdf_mode      = 3; # use dvipdfmx

# -interaction=nonstopmode: エラーがあっても止まらずにコンパイル
# -file-line-error: エラーの起きたファイル名と行番号の表示

$max_repeat    = 10;
```

ターミナル上で，以下のコマンドを実行すれば，自動で複数回コンパイルされpdfが生成される．

```sh
latexmk main.tex # texファイルがmain.texという名前の場合
```

エディタによってはlatexmkをもとに，保存に合わせて自動でコンパイルできる．
VScodeでは，拡張機能のlatex-workshopをダウンロードした後，setting.jsonを以下のように設定すればよい．

```json:setting.json
"latex-workshop.latex.recipes": [
    {
        "name": "latexmk",
        "tools": [
            "latexmk"
        ]
    }
],
"latex-workshop.latex.tools": [
    {
        "args": [
            "-f",
            "-gg",
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "%DOC%"
        ],
        "command": "latexmk",
        "name": "latexmk"
    }
],
"latex-workshop.view.pdf.viewer": "tab",
"latex-workshop.latex.clean.fileTypes": [
    "*.aux",
    "*.blg",
    "*.idx",
    "*.ind",
    "*.lof",
    "*.lot",
    "*.out",
    "*.acn",
    "*.acr",
    "*.alg",
    "*.glg",
    "*.glo",
    "*.gls",
    "*.ist",
    "*.fls",
    "*.log",
    "*.fdb_latexmk"
],
"latex-workshop.latex.autoClean.run": "onBuilt"
```

これで，保存時に自動で更新されて中間ファイルが削除される．

## まとめ

せっかく$\rm\TeX$を使うならBibtexが使えないと勿体ないのでぜひ使いましょう．

### 付録：bibファイルの自動生成

さらに楽をするために，bibファイルを自動で生成する方法を考える．
Mendelayで文献管理をしている場合，持ってる文献全部のbibtexを出力できる．
設定->Bibtexから以下のようにどこにどのような形式でbibファイルを出力するかを設定できる．[![Image from Gyazo](https://i.gyazo.com/5651ec85ccd3bfefe0784cce0881e844.png)](https://gyazo.com/5651ec85ccd3bfefe0784cce0881e844)
ただし，このままだと

- `month`の項が正しく出力されない
- `title`の大文字小文字がちぐはぐ

となるので，以下のシェルscriptでbibファイルを整形する（mac環境を想定）．

```zsh:renameLibrary.zsh
#!/bin/zsh

# Mendeleyから出力したBibtex用のライブラリファイルを正しい月表示に変更し，タイトル表記を統一する
cp library.bib library-new.bib

sed -i '' -e '/^month = /d' library-new.bib
sed -i '' -e '/^title = /s/= {{/= {/g' library-new.bib
sed -i '' -e '/^title = /s/}},/},/g' library-new.bib
```

### 付録：文献種類一覧

文献の種類一覧とそれぞれに書ける項目を書いた，ただし任意項目はこれだけではないことに注意．

| 文献種類                 | bibtex         | 必須項目                                               | 任意項目                                                                             |
| ------------------------ | -------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------ |
| 学術論文                 | @article       | author, title, journal year                            | volume, number, pages, month, note                                                   |
| 博士論文                 | @phdthesis     | author, title, school, year                            | type, address, month, note                                                           |
| 修士論文                 | @mastersthesis | author, title, school, year                            | type, address, month, note                                                           |
| プロシーディングス       | @proceedings   | title, year                                            | editor. volume, number, series, address, month, organization, publisher, note        |
| プロシーディングスの一部 | @inproceedings | author, title, booktitle, year                         | editor, volume, number, series, pages, address, month, organization, publisher, note |
| 会議録                   | @conference    | author, title, booktitle, year                         | editor, volume, number, series, pages, address, month, organization, publisher note  |
| 書籍                     | @book          | author  editor, title, publisher, year                 | volume, number. series, address, edition, month, note                                |
| 小冊子                   | @booklet       | title                                                  | author, howpublished, address, month, year, note                                     |
| 書籍の一部               | @inbook        | author  editor, title, chapter  pages, publisher, year | volume, number. series, type, address, edition, month, year                          |
| 書籍の一部（表題あり）   | @incollection  | author, title, booktitle, publisher, year              | editor, volume, number, series, type, pages, address, edition, month, note           |
| マニュアル               | @manual        | title                                                  | author, organization, address, edition, month, year, note                            |
| 技術報告書               | @techreport    | author, title, institution,                            | type, number, address, month, note                                                   |
| 未発表                   | @unpublished   | author, title, note                                    | month, year                                                                          |
| その他                   | @misc          |                                                        | author, title, howpublished, month, year; note                                       |

参考：[LaTeX参考文献処理(BibTeX)](http://www.yamamo10.jp/yamamoto/comp/latex/bibtex/bibtex.html)