ラテビブラテラテ
ラテビブラテラテ
ラテビブラテラテ
という呪文があります.Bibを使って文献を管理している時の$\LaTeX$文章のコンパイル方法です.
- $\LaTeX$
- BibTeX
- $\LaTeX$
- $\LaTeX$
の順番に回せば,参照番号及び参考文献が載った文書を作成することができるというもの.
この記事では,なぜこの順番で処理を回す必要があるのか,BibTeXと$\LaTeX$を動かしながら考えます.
前提
以下のような.texファイルと.bibファイルを用意します.
\documentclass{jsarticle}
\begin{document}
ここで,\cite{Mya2}の実装を拡張して自動微分を組むと...
\bibliographystyle{plain}
\bibliography{references}
\end{document}
@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回目]
コマンド
platex _.tex
結果
エラー箇所
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ファイルが生成される
\relax
\citation{Mya2}
\bibstyle{plain}
\bibdata{references}
\gdef \@abspage@last{1}
DVIファイル
2.pBibTeXを動かす
コマンド
pbibtex _
pbibtexでは,引数において拡張子を除いたtexファイル名を指定します.
厳密に言えば,pbibtexはauxファイル名もしくは拡張子を除いたauxファイル名を引数として受け取る仕様となっています.しかし,本記事で紹介する手順においては,生成されたauxファイルとtexファイルの名前が一致するため,このような説明となっております.
結果
エラー箇所
なし
AUXファイル
変化なし
BBLファイルが生成される
\begin{thebibliography}{1}
\bibitem{Mya2}
Mya-Mya.
\newblock 自動微分を実装して減衰振動を微分してみる, 01 2023.
\end{thebibliography}
DVIファイル
3.pLaTeXを動かす[2回目]
コマンド
platex document.tex
結果
エラー箇所
Citation `Mya2' on page 1 undefined on input line 4.
AUXファイルが変更される
\relax
\citation{Mya2}
\bibstyle{plain}
\bibdata{references}
+ \bibcite{Mya2}{1}
\gdef \@abspage@last{1}
DVIファイル
4.pLaTeXを動かす[3回目]
エラー箇所
無し
AUXファイル
変更なし
DVIファイル
考察
これらを踏まえると,以下のように動作していると考えられます.
それぞれのファイルの役割
- TEX : 書くやつ.
- BIB : これも書くやつ.
- AUX : BiBファイル等の外部データや引用番号等,情報を繋ぐ役割.
- \bibdata : 文書内で表示する参考文献リストのBIBファイル名.pBibTeXに読み込まれる.
- \bibcite : 文書内で表示する引用番号と参考文献の対応付けを行う.
- BBL : 文書内で表示する参考文献リストのマークアップ.
- DVI : PDFの前身みたいなもの.PDF以外にも様々な形式になれる.
それ以外のやつはログファイルであり,要らないものです.ラテビブラテラテを行うことで,これらが徐々に繋がっていくのですね.
シーケンス図
いろいろ実験
以上で考察した動作原理が正しいかを見るために,色々と実験してみます.
pLaTeX[1回目]後にAUXの\bibdataをすり替える
pBibLaTeXは,AUXファイル内の\bibdataで指定されているBiBファイルを見て,BBLファイルを生成します.
それでは,AUXファイル内の\bibdataで指定されているBiBファイルを別のものにすり替えてからpBibLaTeXを実行すれば,参考文献リストを改ざんできるはず.
という訳で,以下のような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ファイルを以下のように変えます.
\relax
\citation{Mya2}
\bibstyle{plain}
- \bibdata{references}
+ \bibdata{references2}
\gdef \@abspage@last{1}
ビブするとBBLファイルが以下のようになり,参考文献が改ざんされています.
\begin{thebibliography}{1}
\bibitem{Mya2}
Mya-Mya.
\newblock バカめこっちは残像だ, 01 4000.
\end{thebibliography}
その後ラテラテすると以下のようなDVIが得られ,参考文献が改ざんされました!
2回目のpLaTeX後にAUXの\bibciteを改ざん
AUXファイル内の\bibciteは,\citeで指定されたKeyと引用番号を対応付けています.
では,ここを適当な文字列に変えれば,引用番号がメチャクチャになるはずです.
\relax
\citation{Mya2}
\bibstyle{plain}
\bibdata{references}
- \bibcite{Mya2}{1}
+ \bibcite{Mya2}{わーわーギャーギャーウェーイwwwwwww}
\gdef \@abspage@last{1}
その後ラテすると,予想通り,以下のようなDVIが得られます.
まとめ
BiBTeX及びLaTeXの動作原理を考察してみました.ラテビブラテラテを実行する裏にはこのようなロジックが隠れていたのですね.これで一つ,意味不明な$\TeX$システムの解明が進みました.