BibLaTeXで日本語文献を扱う
目次
BibLaTeXで日本語文献を扱うための設定を紹介する。BibLaTeXの使い方はBibLaTeXの導入メモ | はたらく双対性が参考になる。日本語文献の扱いは、BibLaTeXで日本語文献と英語文献の混在を扱う - Qiitaとbiblatex-jpa: 日本心理学会2022年版文献スタイルが大いに参考になる。この記事ではスタイルを自作するほど高度なものではなく、簡易的に日本語文献の書式を整える。
BibLaTeXとは? #
BibLaTeXはLaTeX用の文献管理ツールだ。BibTeXよりも高機能であり、UTF-8に対応している。文献表示の書式をTeXマクロで制御しているので、複雑なBibTeXスタイルファイルを書くよりも、簡単にカスタマイズできる(はずである)。ただ、日本語情報がほとんどないので、実際にカスタマイズするのは難しいかもしれない。
BibLaTeXの設定 #
BibLaTeXの設定はbiblatex.cfgファイルに書くといい。プリアンブルに書くよりも、LaTeXソースファイルがすっきりする。コピペで使いまわしも簡単にできる。biblatex.cfgファイルはLaTeXソースファイルと同じフォルダーに置くと自動的に読み込まれる。
設定の詳細はCTAN: Package BibLaTeXの公式マニュアルに書いてある。しかし英語で分量も多い。具体的にどうすればいいかわかりにくい。plk/biblatex: biblatexにあるソースコードが理解の助けとなる。
biblatex.defに標準で定義されたマクロやコマンドがある。standard.bbxに標準のスタイルがある。この2つを見ればだいたいわかる。また、公式サンプル集も参考になる。WindowsならソースコードはC:\texlive\2023\texmf-dist\tex\latex\biblatex
にある。サンプル集はC:\texlive\2023\texmf-dist\doc\latex\biblatex\examples
にある。
日本語文献のためのbiblatex.cfg #
日本語文献を表示するためのbiblatex.cfgを作ってみた。BibLaTeXの標準スタイルを使用することを想定している。日本語文献の判定のために、bibファイルのエントリーにlangidフィールドを追加し、japaneseとしておく必要がある。
標準スタイルについてはbiblatex の標準スタイルの解説 - Qiitaに詳しい。
\ProvidesFile{biblatex.cfg}[2023/04/10 biblatex configuration for Japanese]
\ExecuteBibliographyOptions{
date = year, % 日付は年のみを表示
maxbibnames=20, % 参考文献リストで表示する著者の最大数
maxnames=3, % 表示する著者の最大数。超えるとminnamesだけ表示して後は省略する
minnames=1, % 表示する著者の最小数
}
%% 著者名のフォーマットを宣言
%% biblatex.defのfamily-givenとlabelnameを日本語用に
\DeclareNameFormat{japanese}{%参考文献リストでのフォーマット
\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}%
\usebibmacro{name:andothers}}
\DeclareNameFormat{labelname-japanese}{% 文中でのフォーマット
\ifcase\value{uniquename}%
\usebibmacro{name:family}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}%
\or
\usebibmacro{name:family-given}
{\namepartfamily}
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}%
\fi
\usebibmacro{name:andothers}}
%% 参考文献リストでの表記を設定
\AtEveryBibitem{%
\iffieldequalstr{langid}{japanese}
{\DeclareNameAlias{default}{japanese}%
\DeclareNameAlias{sortname}{japanese}%
\renewcommand*{\revsdnamepunct}{}% 姓と名の間のコンマを消去
\DeclareDelimFormat{multinamedelim}{・}% 著者名の区切り文字
\DeclareDelimFormat{finalnamedelim}{・}% 著者名の最後の区切り文字
\renewbibmacro*{bytranslator}{% 翻訳者の表記
\ifnameundef{translator}
{}
{\printnames[bytranslator]{translator}\printtext[parens]{訳}}}%
\renewbibmacro*{bytranslator+others}{\usebibmacro{bytranslator}}%
% タイトルの書式
\DeclareFieldFormat*{title}{「#1」}% タイトルを「」で囲む
\DeclareFieldFormat[book]{title}{『#1』}% 本のタイトルを『』で囲む
\DeclareFieldAlias{booktitle}[book]{title}% 文献を収録する本のタイトルを『』で囲む
\DeclareFieldAlias{journaltitle}[book]{title}% 雑誌名を『』で囲む
\renewbibmacro{in:}{}% In:を削除
}{}%
}
%% 文中の引用での表記を設定
\AtEveryCitekey{%
\iffieldequalstr{langid}{japanese}
{\DeclareNameAlias{labelname}{labelname-japanese}%
\DeclareDelimFormat{multinamedelim}{・}%
\DeclareDelimFormat{finalnamedelim}{・}%
\renewcommand*{\revsdnamepunct}{}%
}{}%
}
\endinput
\ProvidesFile #
\ProvidesFile{<ファイル名>}[<追加情報>]
は設定ファイルの宣言。クラスファイルやパッケージファイル以外のファイルに使う1。ログにファイル名と追加情報が表示される。
\ExecuteBibliographyOptions #
\ExecuteBibliographyOptions{<key=value>}
はBibLaTeXのオプションを設定する。biblatex のオプションの解説 - Qiitaに詳しい。
\DeclareNameFormat #
\DeclareNameFormat{<フォーマット名>}{<コード>}
は著者名に使うnameフォーマットを宣言する。ここでは日本語文献用に2つのnameフォーマットを定義している。中身はbiblatex.defにあるfamily-givenとlabelnameフォーマットからイニシャルの処理を省いたものだ。
family-givenは姓・名という順番で名前を表示するフォーマットだ。namepartfamilyは姓、namepartgivenは名である。
labelnameは本文中の引用表示での名前のフォーマットだ。
\AtEveryBibitem #
\AtEveryBibitem{<コード>}
は参考文献リストにおいて、項目ごとに<コード>を実行する。つまり、.bibファイルのエントリーごとに処理を実行できる。
\iffieldequalstr #
\iffieldequalstr{<フィールド名>}{<文字列>}{<true>}{<false>}
はフィールドの値が文字列に一致するかを判定する。一致したときはtrueのコード、一致しないときはfalseのコードを実行する。
bibアイテムのlangidフィールドの値がjapaneseかを判定し、真の場合に日本語文献用のコードを実行する。
\DeclareNameAlias #
\DeclareNameAlias{<エイリアス名>}{<フォーマット名>}
は定義済みのnameフォーマットのエイリアス(別名)を宣言する。
ここでは"japanese"の別名に、defaultとsortnameを宣言している。この2つはbiblatex.defで定義されているnameフォーマットであり、エイリアスとして宣言したことで、japaneseフォーマットに上書きされる。
defaultフォーマットはnumericとalphabeticスタイル、sortnameフォーマットはauthroryearスタイルなどで使用される2。
\revsdnamepunct #
\revsdnamepunct
は姓・名の順に名前が表示されるとき、区切り文字を表示するコマンドだ。標準ではコンマ(,)を表示する。日本語の場合は不要なので\renewcommand*{<コマンド名>}{<定義>}
でコマンドの中身を空にした。
\renewcommand*
はコマンドを再定義する。*は\renewcommand
の別バージョンという意味だ。*付きコマンドで再定義されたコマンドは、引数に段落を含むことができないという違いがある34。
\DeclareDelimFormat #
\DeclareDelimFormat{<フォーマット名>}{<コード>}
は、区切り文字のフォーマットを宣言する。定義済みのものは上書きされる。multinamedelimは著者名の区切りであり、標準ではコンマ(,)だ。finalnamedelimは最後の著者名の区切り文字であり、標準では"and"だ。
\renewbibmacro* #
\renewbibmacro*{<マクロ名>}{<定義>}
はbibmacroを再定義する。*の意味は\renewcommand*
と同じである。
bytranslatorという名のマクロを再定義している。もともとは"Trans. by <翻訳者>“という表記だったのを”<翻訳者> (訳)“に変えている。標準スタイルで実際に使われるのはbytranslator+othersというマクロだ。これをbytranslatorを使用するマクロに再定義している。
othersの部分の表記が消えるなど標準とは違った挙動になっている。具体的にはcommentatorやannotatorフィールドは出力されない。マクロが複雑なので省略した。詳細はbiblatex.defを参照してほしい。
\DeclareFieldFormat #
\DeclareFieldFormat[<エントリータイプ>]{<フォーマット名>}{<コード>}
は、フィールド用のフォーマットを宣言する。エントリータイプにbookやarticleなど文献の種類を指定すると、その種類にのみ適用される。ここでは、文献タイトルは「」で囲むようにしている。文献の種類が@bookであれば『』で囲む。
詳しく説明すると、\printfield[<フォーマット名>]{<フィールド名>}
や\printtext[<フォーマット名>]{<テキスト>}
コマンドで宣言したフォーマットが指定されるとコードが実行される。#1はこのとき渡される引数であり、表示するフィールドの値や文字列になっている。
つまり\DeclareFieldFormat{title}{「#1」}
は、渡された文字列を「」で囲んで出力する。\printfield{title}
を実行すると”「<titleフィールドの値>」“と出力される。
ちなみに\printfield
でフォーマットを指定しなかった場合は、フィールド名と同じ名前のフォーマットが自動的に適応される。つまり、\printfield{title}
は\printfield[title]{title}
と同じである。
titleフォーマットは、biblatex.defで定義済みであり、文献タイトルの表示に使われる。ここで再定義することで文献タイトルが「」で囲まれることになる。
\DeclareFieldFormat*
は、エントリータイプを指定したフォーマットをすべてクリアする。
\DeclareFieldAlias #
DeclareFieldAlias[<エントリータイプ>]{<エイリアス名>}[<フォーマットのエントリータイプ>]{<フォーマット名>}
は、フォーマットのエイリアスを宣言する。DeclareNameAliasと同じようなものだ。
ここではbiblatex.defで定義済みのbooktitle、journaltitleフォーマットを、文献の種類が@bookの場合のフォーマットで上書きしている。
\AtEveryCitekey #
\AtEveryCitekey{<コード>}
は、\cite
などの引用コマンドにbibファイルのエントリーが渡されるたびに、<コード>を実行する。
DeclareNameAliasで宣言しているlabelnameは、文中の引用表記におけるnameフォーマットだ。biblatex.defに定義済みのものを、日本語用のlabelname-japaneseフォーマットで上書きしている。
参考文献 #
Class and package commands (LaTeX2e unofficial reference manual (January 2023)) ↩︎
Guidelines for customizing biblatex styles - TeX - LaTeX Stack Exchange ↩︎
\newcommand & \renewcommand (LaTeX2e unofficial reference manual (January 2023)) ↩︎
macros - What’s the difference between \newcommand and \newcommand*? - TeX - LaTeX Stack Exchange ↩︎