LaTeXで文献リストを直書きする話
LaTeXで文献リスト(“参考文献”の節に出すリスト)を出力する方法というと、BibTeX1を利用する手順が紹介されることが多い。
\bibliographystyle{jplain}% 文献スタイル(*.bst)を指定する \bibliography{zr-bib}% 文献データベース(*.bib)を指定する
BibTeXを使う場合、文献リストの体裁(句読点の付け方や細目の表現など)は「文献スタイル」の制御下にあるため、体裁に微調整が必要な場合に時として苦行(BeaST言語)が発生することになる。
この苦行を回避するための方策として「BibTeXを使わずに文献リストを“直書き”する」というものがある。LaTeXには文献リストを“直書き”するための環境であるthebibliography環境が用意されている。
[LaTeX文書1]
\documentclass[uplatex, dvipdfmx, a4paper]{jsarticle} \begin{document} すごい論文\cite{zr-art}および本\cite[8章]{zr-book}によると, {\TeX}はアレ. % thebibliography環境で文献リストを"直書き"できる. \begin{thebibliography}{[9]} \bibitem{zr-art} 某ZR.メッチャすごい論文,2020. \bibitem{zr-book} 某ZR.メッチャすごい本,2022. \end{thebibliography} \end{document}
この例では文献の番号は自動採番に従うが2、\bibitem
にオプション引数を指定することで任意の文字列を“番号”として使える。
[LaTeX文書2]
\documentclass[uplatex, dvipdfmx, a4paper]{jsarticle} \begin{document} すごい論文\cite{zr-art}および本\cite[8章]{zr-book}によると, {\TeX}はアレ. \begin{thebibliography}{[MMM99]} % オプション引数に手動で"番号"を指定する. \bibitem[ZR20]{zr-art} 某ZR.メッチャすごい論文,2020. \bibitem[ZR22]{zr-book} 某ZR.メッチャすごい本,2022. \end{thebibliography} \end{document}
Typstで文献リストする話
Typstで文献リストを出力するために用意されているのはbibliography
関数である。
#bibliography( "zr-bib.yaml", // 文献ファイル(Hayagriva形式) style: "ieee", // 文献スタイル(CSLファイルまたは内蔵) )
ここで第1引数は「文献ファイル3」で、BibTeX形式またはHayagriva形式4のファイルを指定する。style
引数は「文献スタイル」で、CSL形式のスタイル定義ファイルを指定するが、いくつかのスタイルについては定義が処理系に内蔵されていて、それらは名前(ieee
など)を指定することで利用できる。
Typstで文献リストを直書きできない話
明らかにTypstのbibliography
関数はLaTeXの\bibliography
命令に相当するもの、すなわちBibTeXを使う手順に相当する。そうすると当然「体裁に微調整が必要な場合」の対処が気になってくる。ところが、Typstの標準の機能には「文献リストを“直書き”する」ためのものがないようである。bibliography
関数では明らかにできないし、それ以外の「文献リストを出力するための関数」というのも見当たらない。
一見すると「“直書き”の文献リストは単なる箇条書きである」から適当にカスタマイズしたenum
関数を使えばよいようにも思える。
[Typst文書1]
#set text( // 和文出力用の最低限の設定 lang: "ja", font: "Harano Aji Mincho", size: 10pt, top-edge: 0.88em, spacing: 0.25em, ) // 文献リストを"直書き"した #set heading(numbering: none) #set enum(numbering: "[1]") = 参考文献 + 某ZR.メッチャすごい論文,2020. + 某ZR.メッチャすごい本,2022.
ところが実際にはこの方針はうまくいかない。文献リストは出力できるが、その中の文献項目を参照することができないのである。
[Typst文書2]
// 和文出力用の最低限の設定(先の例と同じ)は以後省略 // 参照しようとするとエラーになる😭 すごい論文 @zr-art によると… #set heading(numbering: none) #set enum(numbering: "[1]") = 参考文献 // ラベルを付けてみた + 某ZR.メッチャすごい論文,2020.<zr-art> + 某ZR.メッチャすごい本,2022.<zr-book>
(コンパイル時のエラー)
error: cannot reference text ┌─ \\?\C:\tmp\holen\jan.typ:8:6 │ 8 │ すごい論文 @zr-art によると… │ ^^^^^^^
この参照が失敗するのは、Typstの仕様ではそもそも箇条書きの項目は“参照可能(referenceable)ではない”からである5。
Referenceable elements include headings, figures, equations, and footnotes. To create a custom referenceable element like a theorem, you can create a figure of a custom kind and write a show rule for it.
この参照可能要素に関する制限があるため、単純に「マークアップとset ruleの設定」でできる範囲で「“直書き”の文献リスト」として機能するものをユーザが作り上げるのは恐らく無理であろう。
それでもTypstで文献リストを直書きしたい話
結局のところ、Typstは「文献リストを“直書き”する」機能は不要だと判断していると推測される。しかし、特に“和文対応”を前提にした場合に、その判断は妥当だろうか?
Typstの文献スタイル指定にはCitation Style Language(CSL)という言語が採用されている。これは文献項目の書式をXMLで宣言的に記述したものであり、プログラミング言語であるBeaST言語とは性質が異なる。このため(特に非プログラミング者の視点で)CSL形式の文献スタイルの改修6はBibTeXよりは容易であろう。一方でプログラミング言語ではないため「想定外の複雑なスタイルは表現できない」ことが予想される。
この観点で検討した場合に真っ先に問題になりそうなのが「和欧文文献混在」のパターンである。日本における文献リストの書式の要件として「一つの文献リストの中で和文の文献7と欧文の文献では異なる書式(句読点の選択8など)を用いる」というものがある。
この要件は“日本であまり普及していない文献ツール”を利用するときに度々問題になる。例えば以下に挙げる記事はbiblatexでこの要件を扱う方法を述べたものである。
- BibLaTeXで日本語文献と英語文献の混在を扱う(Qiita/@sbtseiji)
この辺りのCSLの対応状況を調べるため公式サイトを見ると、早々に白旗が上がっていることがわかる😭
But even a well-coded style still has some limitations: CSL doesn’t yet allow for per-item localization (for example, some styles require Japanese items to be cited in Japanese, and English items in US English), and doesn’t always support all grammatical peculiarities of your favorite language.
少なくとも現状では、CSLは日本での「和欧文文献混在」の要件には対応できないようである。従って、CSLに完全に依存しているTypstの文献リスト機能は現状では不十分であると言わざるをえない。
もちろんこれは現時点での話であり、将来にはCSLやTypstの側で解決されることが期待できる。それまでの間は「文献リストを“直書き”する」というのが簡単な“回避策”となるはずである。
Typstで文献リストを直書きする話
というわけで、Typstで「文献リストを“直書き”する」ためのパッケージ“bxbibwrite”を作ってみた😃
- bxbibwrite:Typstで文献リストを直書きするやつ(Gist/@zr-tex8r) ※0.2.1版でTypstの0.12版に対応しました。
bxbibwriteをインストールする話
公開レポジトリにはまだ登録していなので、各自ローカルでインストールする必要がある。以下の記事が参考になる。
- 【ここに何かTypstのローカルのパッケージのインストール方法を日本語で解説した記事のリンクを貼る🙂】
……ことができればよかったのだけど、そういう記事をまだ誰も書いていない😭
仕方がないので、公式解説へのリンクを示すことにする。
Typst Packages / Local packages(GitHub/@typst)
bxbibwriteを使う話
パッケージの読込は以下の通り。import
で読み込んだ後、use-bib-item-ref
をshow ruleで有効化する。
※バージョン0.2.1
の部分は実際のものに合わせること。
#import "@local/bxbibwrite:0.2.1": * #show: use-bib-item-ref
基本的なインタフェースはLaTeXのthebibliography
環境に合わせている。文献リストを出力するのがbibliography-list
関数であり、その引数の内容の中でbib-item
関数で各々の文献項目を記述する。
#bibliography-list( title: "参考文献", // 節見出しの文言 )[ #bib-item(<zr-art>)[某ZR.メッチャすごい論文,2020.] #bib-item(<zr-book>)[某ZR.メッチャすごい本,2022.] ]
ここでbibliography-list
のオプション引数title
は文献リストの節見出しの文言である(既定値は“Bibliography”)。bib-item
の第1引数に文献項目に紐づけるラベルを指定する。
文献の参照(“[1]”等の文献番号の出力)は、Typstの本来の文献リスト(bibliography
関数)の場合と同様9にref
関数(またはその簡易表記の@ラベル名
)で行える。補足説明を同時に出力するためにsupplement引数10を指定することもできる。
[Typst文書3]
////(ここに和文出力用の設定が入る) // bibwriteパッケージ読込 #import "@local/bxbibwrite:0.2.0": * #show: use-bib-item-ref すごい論文 @zr-art や本 @zr-book[8章] によると、☃は素敵。 // 文献リストを"直書き"した #bibliography-list( title: "参考文献", // 節見出しの文言 )[ #bib-item(<zr-art>)[某ZR.メッチャすごい論文,2020.] #bib-item(<zr-book>)[某ZR.メッチャすごい本,2022.] ]
bxbibwriteをもっと使う話
文献番号を自動採番ではなく手動で指定したい場合は、bib-item
関数のオプション引数key
を利用する。
[Typst文書4]
////(ここに和文出力用の設定が入る) #import "@local/bxbibwrite:0.2.0": * #show: use-bib-item-ref すごい論文 @zr-art や本 @zr-book[8章] によると、☃は素敵。 #bibliography-list(title: "参考文献")[ // key引数で"番号"を手動で指定できる. #bib-item(<zr-art>, key: "ZR20")[某ZR.メッチャすごい論文,2020.] #bib-item(<zr-book>, key: "ZR22")[某ZR.メッチャすごい本,2022.] ]
文献番号の出力書式は既定では“[1]”のようになるが、これを“(1)”に変更したい場合は、use-bib-item-ref
関数のオプション引数numbering
を指定する11。具体的には、パッケージ読込時のshow ruleを以下のように書き換える。
#show: use-bib-item-ref.with(numbering: "(1)")
[Typst文書5]
////(ここに和文出力用の設定が入る) #import "@local/bxbibwrite:0.2.0": * // 文献番号の書式を変更する. #show: use-bib-item-ref.with(numbering: "(1)") すごい論文 @zr-art や本 @zr-book[8章] によると、☃は素敵。 #bibliography-list(title: "参考文献")[ #bib-item(<zr-art>)[某ZR.メッチャすごい論文,2020.] // "番号"を手動で変更した. #bib-item(<zr-book>, key: "1a")[某ZR.メッチャすごい本,2022.] ]
さらに、use-bib-item-ref
関数とは別にbibliography-list
関数にもオプション引数numbering
が存在する。これは文献リストの中の文献番号だけ書式を変更するためのものである。
[Typst文書6]
////(ここに和文出力用の設定が入る) #import "@local/bxbibwrite:0.2.0": * // 文献参照での番号の書式は変えない("[1]"のまま). #show: use-bib-item-ref すごい論文 @zr-art や本 @zr-book[8章] によると、☃は素敵。 #bibliography-list( title: "参考文献", numbering: "☃1", // ゆきだるま😊 )[ #bib-item(<zr-art>)[某ZR.メッチャすごい論文,2020.] #bib-item(<zr-book>, key: "1a")[某ZR.メッチャすごい本,2022.] ]
まとめ
Typstの標準の文献リスト機能の“和文対応”が早く完璧になってほしいですね😃
- 海外では新しいツールであるbiblatexも普及しているが、恐らく和文対応のノウハウが蓄積されていないせいで、日本ではあまり普及していないようである。↩
-
なお、thebibliography環境の引数の
[9]
はリスト出力での番号部分の横幅を決めるためのものである。(番号の書式を決めるものではない。)↩ - BibTeXの「文献データベースファイル」に相当するもの。↩
- HayagrivaはTypstのために新たに開発された文献管理ライブラリである。↩
-
さらに言うと、
+ 某ZR…,2020.<zr-art>
と書いた場合にラベル<zr-art>
が付けられている要素は単なるテキストの塊の某ZR…,2020.
であり、箇条書きの項目(enum.item
要素)にはなっていない。↩ - GUIベースの改修ツールも公開されているようである。↩
- ここで「和文の文献」とは「リスト中で和文で表記される文献項目」のことである。もちろん、日本語で著されている文献を(英訳などをして)欧文表記の文献項目として扱うという方法もある。↩
- 当然、和文で表記されているなら句読点は和文の規則に従うべきである。↩
-
ただし、本パッケージの文献リストの参照に
cite
関数を使うことはできない。↩ -
簡易表記
@ラベル[補足]
において、後ろに付けた内容ブロック(content block)がsupplement引数である。この簡易表記は#ref(<ラベル>, supplement: [補足])
と同等になる。↩ -
numbering
引数に指定するのは書式指定用のパターン文字列である。これはTypstのnumbering
関数の第1引数などで用いられるパターン文字列と類似の記法に従うが、「手動で設定した番号の文字列」や「supplement引数の内容」がカウンタ記号の位置に挿入されるなど、若干の相違点もある。詳細については説明書(READMEファイル)を参照してほしい。↩