マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

Typstだって文献リストの直書きをしたい

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}

LaTeX文書1の出力

この例では文献の番号は自動採番に従うが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}

LaTeX文書2の出力

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文書1の出力

ところが実際にはこの方針はうまくいかない。文献リストは出力できるが、その中の文献項目を参照することができないのである。

[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.

Typst Documentation: ref

この参照可能要素に関する制限があるため、単純に「マークアップとset ruleの設定」でできる範囲で「“直書き”の文献リスト」として機能するものをユーザが作り上げるのは恐らく無理であろう。

それでもTypstで文献リストを直書きしたい話

結局のところ、Typstは「文献リストを“直書き”する」機能は不要だと判断していると推測される。しかし、特に“和文対応”を前提にした場合に、その判断は妥当だろうか?

Typstの文献スタイル指定にはCitation Style Language(CSL)という言語が採用されている。これは文献項目の書式をXMLで宣言的に記述したものであり、プログラミング言語であるBeaST言語とは性質が異なる。このため(特に非プログラミング者の視点で)CSL形式の文献スタイルの改修6BibTeXよりは容易であろう。一方でプログラミング言語ではないため「想定外の複雑なスタイルは表現できない」ことが予想される。

この観点で検討した場合に真っ先に問題になりそうなのが「和欧文文献混在」のパターンである。日本における文献リストの書式の要件として「一つの文献リストの中で和文の文献7と欧文の文献では異なる書式(句読点の選択8など)を用いる」というものがある。

和文と欧文の書式が異なる例(句読点にも注意)

この要件は“日本であまり普及していない文献ツール”を利用するときに度々問題になる。例えば以下に挙げる記事はbiblatexでこの要件を扱う方法を述べたものである。

この辺りの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.

(Authors - Citation Style Language)

少なくとも現状では、CSLは日本での「和欧文文献混在」の要件には対応できないようである。従って、CSLに完全に依存しているTypstの文献リスト機能は現状では不十分であると言わざるをえない。

もちろんこれは現時点での話であり、将来にはCSLやTypstの側で解決されることが期待できる。それまでの間は「文献リストを“直書き”する」というのが簡単な“回避策”となるはずである。

Typstで文献リストを直書きする話

というわけで、Typstで「文献リストを“直書き”する」ためのパッケージ“bxbibwrite”を作ってみた😃

bxbibwriteをインストールする話

公開レポジトリにはまだ登録していなので、各自ローカルでインストールする必要がある。以下の記事が参考になる。

  • 【ここに何かTypstのローカルのパッケージのインストール方法を日本語で解説した記事のリンクを貼る🙂】
    ……ことができればよかったのだけど、そういう記事をまだ誰も書いていない😭
    仕方がないので、公式解説へのリンクを示すことにする。
    Typst Packages / Local packagesGitHub/@typst)

bxbibwriteを使う話

パッケージの読込は以下の通り。importで読み込んだ後、use-bib-item-refをshow ruleで有効化する。

※バージョン0.2.1の部分は実際のものに合わせること。

#import "@local/bxbibwrite:0.2.1": *
#show: use-bib-item-ref

基本的なインタフェースはLaTeXthebibliography環境に合わせている。文献リストを出力するのが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関数)の場合と同様9ref関数(またはその簡易表記の@ラベル名)で行える。補足説明を同時に出力するために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.]
]

Typst文書3の出力

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.]
]

Typst文書4の出力

文献番号の出力書式は既定では“[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.]
]

Typst文書5の出力

さらに、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文書6の出力

まとめ

Typstの標準の文献リスト機能の“和文対応”が早く完璧になってほしいですね😃


  1. 海外では新しいツールであるbiblatexも普及しているが、恐らく和文対応のノウハウが蓄積されていないせいで、日本ではあまり普及していないようである。
  2. なお、thebibliography環境の引数の[9]はリスト出力での番号部分の横幅を決めるためのものである。(番号の書式を決めるものではない。)
  3. BibTeXの「文献データベースファイル」に相当するもの。
  4. HayagrivaはTypstのために新たに開発された文献管理ライブラリである。
  5. さらに言うと、+ 某ZR…,2020.<zr-art>と書いた場合にラベル<zr-art>が付けられている要素は単なるテキストの塊の某ZR…,2020.であり、箇条書きの項目(enum.item要素)にはなっていない。
  6. GUIベースの改修ツールも公開されているようである。
  7. ここで「和文の文献」とは「リスト中で和文で表記される文献項目」のことである。もちろん、日本語で著されている文献を(英訳などをして)欧文表記の文献項目として扱うという方法もある。
  8. 当然、和文で表記されているなら句読点は和文の規則に従うべきである。
  9. ただし、本パッケージの文献リストの参照にcite関数を使うことはできない。
  10. 簡易表記@ラベル[補足]において、後ろに付けた内容ブロック(content block)がsupplement引数である。この簡易表記は#ref(<ラベル>, supplement: [補足])と同等になる。
  11. numbering引数に指定するのは書式指定用のパターン文字列である。これはTypstのnumbering関数の第1引数などで用いられるパターン文字列と類似の記法に従うが、「手動で設定した番号の文字列」や「supplement引数の内容」がカウンタ記号の位置に挿入されるなど、若干の相違点もある。詳細については説明書(READMEファイル)を参照してほしい。