【ラテビブラテラテ】BibTeXの動作原理を考察する

> ラテビブラテラテ
ラテビブラテラテ
ラテビブラテラテ

という呪文があります．Bibを使って文献を管理している時の$\LaTeX$文章のコンパイル方法です．

1. $\LaTeX$
2. BibTeX
3. $\LaTeX$
4. $\LaTeX$

の順番に回せば，参照番号及び参考文献が載った文書を作成することができるというもの．
この記事では，なぜこの順番で処理を回す必要があるのか，BibTeXと$\LaTeX$を動かしながら考えます．

# 前提
以下のような.texファイルと.bibファイルを用意します．
```tex:_.tex
\documentclass{jsarticle}
\begin{document}

ここで，\cite{Mya2}の実装を拡張して自動微分を組むと...

\bibliographystyle{plain}
\bibliography{references}
\end{document}
```
```bib:references.bib
@url{Mya2,
	author = {Mya-Mya},
	date-added = {2023-02-10 12:15:04 +0900},
	date-modified = {2023-02-10 12:18:59 +0900},
	keywords = {Python, Machine Learning, AD},
	lastchecked = {2023-02-10},
	month = {01},
	title = {自動微分を実装して減衰振動を微分してみる},
	url = {https://qiita.com/Mya-Mya/items/2777703b25a2e0573d97},
	year = {2023},
	bdsk-url-1 = {https://qiita.com/Mya-Mya/items/2777703b25a2e0573d97}}

@url{Mya3,
	keywords = {Machine Learning, Optimization, TensorFlow},
	lastchecked = {2023-02-10},
	month = {01},
	rating = {0},
	title = {勾配法のハイパラを勾配法によって最適化する"Gradient Descent: The Ultimate Optimizer"の論文をスプレッドシートで実装してみる},
	url = {https://qiita.com/Mya-Mya/items/7a8ba000e0cfa099315e},
	year = {2023}}

```

# 手順と起こったこと
ラテビブラテラテを順番に行い，周辺ファイルの変化を見ます．なお，DVIファイルはdvipdfmxコマンドを用いてPDFに変換後，表示しています．
## 1.pLaTeXを動かす[1回目]
### コマンド
```sh
platex _.tex
```
### 結果
#### エラー箇所
```plaintext
No file document.aux.

LaTeX Warning: Citation `Mya2' on page 1 undefined on input line 4.

No file _.bbl.
[1] (./_.aux)

LaTeX Warning: There were undefined references.
```
#### AUXファイルが生成される
```tex:document.aux
\relax 
\citation{Mya2}
\bibstyle{plain}
\bibdata{references}
\gdef \@abspage@last{1}
```
#### DVIファイル
* 参考文献リストが表示されません．
* 引用番号が？です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/5f22d165-8195-8aff-597d-4842e2948472.png)

## 2.pBibTeXを動かす
### コマンド
```sh
pbibtex _
```
pbibtexでは，引数において拡張子を除いたtexファイル名を指定します．

:::note warn
厳密に言えば，pbibtexはauxファイル名もしくは拡張子を除いたauxファイル名を引数として受け取る仕様となっています．しかし，本記事で紹介する手順においては，生成されたauxファイルとtexファイルの名前が一致するため，このような説明となっております．
:::

### 結果
#### エラー箇所
なし
#### AUXファイル
変化なし
### BBLファイルが生成される
```tex:_.bbl
\begin{thebibliography}{1}

\bibitem{Mya2}
Mya-Mya.
\newblock 自動微分を実装して減衰振動を微分してみる, 01 2023.

\end{thebibliography}
```
#### DVIファイル
変化なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/5f22d165-8195-8aff-597d-4842e2948472.png)

## 3.pLaTeXを動かす[2回目]
### コマンド
```sh
platex document.tex
```
### 結果
#### エラー箇所
```plaintext
Citation `Mya2' on page 1 undefined on input line 4.
```
#### AUXファイルが変更される
```diff_te_x:document.aux
\relax 
\citation{Mya2}
\bibstyle{plain}
\bibdata{references}
+ \bibcite{Mya2}{1}
\gdef \@abspage@last{1}
```
#### DVIファイル
* 参考文献リストが表示されました．
* まだ引用番号は表示されません．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/78660460-9375-351f-8809-def7a2fbe67a.png)

## 4.pLaTeXを動かす[3回目]
#### エラー箇所
無し
#### AUXファイル
変更なし
#### DVIファイル
* 引用番号が表示されました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/e377e630-ea3f-79fb-1023-050ffd482a32.png)

# 考察
これらを踏まえると，以下のように動作していると考えられます．
## それぞれのファイルの役割
* TEX : 書くやつ．
* BIB : これも書くやつ．
* AUX : BiBファイル等の外部データや引用番号等，情報を繋ぐ役割．
    * \bibdata : 文書内で表示する参考文献リストのBIBファイル名．pBibTeXに読み込まれる．
    * \bibcite : 文書内で表示する引用番号と参考文献の対応付けを行う．
* BBL : 文書内で表示する参考文献リストのマークアップ．
* DVI : PDFの前身みたいなもの．PDF以外にも様々な形式になれる．

それ以外のやつはログファイルであり，要らないものです．ラテビブラテラテを行うことで，これらが徐々に繋がっていくのですね．
## シーケンス図
```plantuml
== 執筆 ==
俺 -> TeX: 作る
activate TeX
俺 -> BiB: 作る
activate BiB

== 1.1回目のpLaTeX ==
TeX -> AUX: \bibciteどころかAUXがまだ無い
note over TeX
\citeに
振るべき
番号が分からない
end note
TeX -> AUX: 生成
activate AUX
TeX -> BBL: 見つからない

== 2.pBibTeX ==
BiB -> BBL: 生成
activate BBL

== 3.2回目のpLaTeX ==
TeX -> AUX: \bibciteがまだ無い
note over TeX
\citeに
振るべき
番号が分からない
end note
TeX -> BBL: 見る
note over TeX
BBLの内容=参考文献見出し
を書く
end note
TeX -> AUX: \bibciteを書く

== 4.3回目のpLaTeX ==
TeX -> AUX: \bibciteを見る
note over TeX
\citeに
振るべき
番号が分かった
end note
TeX -> BBL: 見る
note over TeX
BBLの内容=参考文献見出し
を書く
end note
```

# いろいろ実験
以上で考察した動作原理が正しいかを見るために，色々と実験してみます．
## pLaTeX[1回目]後にAUXの\bibdataをすり替える
pBibLaTeXは，AUXファイル内の\bibdataで指定されているBiBファイルを見て，BBLファイルを生成します．
それでは，AUXファイル内の\bibdataで指定されているBiBファイルを別のものにすり替えてからpBibLaTeXを実行すれば，参考文献リストを改ざんできるはず．
という訳で，以下のようなBIBファイルを用意しました．
```bib:references2.bib
@url{Mya2,
	author = {Mya-Mya},
	keywords = {Stupid, Crazy},
	lastchecked = {2023-02-10},
	month = {01},
	title = {バカめこっちは残像だ},
	url = {localhost:8888},
	year = {4000},
	bdsk-url-1 = {localhost:8888}}
```
AUXファイルを以下のように変えます．
```diff_te_x:_.aux
\relax 
\citation{Mya2}
\bibstyle{plain}
- \bibdata{references}
+ \bibdata{references2}
\gdef \@abspage@last{1}
```
ビブするとBBLファイルが以下のようになり，参考文献が改ざんされています．
```tex:_.bbl
\begin{thebibliography}{1}

\bibitem{Mya2}
Mya-Mya.
\newblock バカめこっちは残像だ, 01 4000.

\end{thebibliography}
```
その後ラテラテすると以下のようなDVIが得られ，参考文献が改ざんされました！
![スクリーンショット 2023-02-10 13.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/5921fd55-d316-04ee-5015-4d0113ca887d.png)

## 2回目のpLaTeX後にAUXの\bibciteを改ざん
AUXファイル内の\bibciteは，\citeで指定されたKeyと引用番号を対応付けています．
では，ここを適当な文字列に変えれば，引用番号がメチャクチャになるはずです．
```diff_te_x:_.aux
\relax 
\citation{Mya2}
\bibstyle{plain}
\bibdata{references}
- \bibcite{Mya2}{1}
+ \bibcite{Mya2}{わーわーギャーギャーウェーイwwwwwww}
\gdef \@abspage@last{1}
```
その後ラテすると，予想通り，以下のようなDVIが得られます．
![スクリーンショット 2023-02-10 13.38.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116310/9ee4d0c6-8117-4b67-89fd-ce22874bc053.png)

# まとめ
BiBTeX及びLaTeXの動作原理を考察してみました．ラテビブラテラテを実行する裏にはこのようなロジックが隠れていたのですね．これで一つ，意味不明な$\TeX$システムの解明が進みました．