biblatex で style をカスタマイズするのが大変だった

はじめに

biblatex では文献の表示スタイルをオプション style で指定することができる.また文献のソート方法や一部のフィールド(DOI,URL,ISBNなど)の表示/非表示などもオプションでコントロールできる.基本的にはこれらの方法で事足りるが,私はさらに細かい表示の変更が必要になり,それが大変だったのでここにメモしておく.

結論からいえば,オプションの指定で出来ない変更をしたい場合には,マクロを書き換える必要がある.

biblatex のオプション

基本的なパラメータは  \usepackage{biblatex}  する際に指定することができる.

\usepackeage[
    style=numeric,
    url=false# urlを非表示
    sorting=nty, # 文献ソート方法の指定
]{biblatex}

指定できるオプションについては,たとえば次が詳しい.

また指定できる基本的なスタイルは以下に表示サンプルが記載されている.

より正確には公式ドキュメントを参照.

https://ftp.kddilabs.jp/CTAN/macros/latex/contrib/biblatex/doc/biblatex.pdf

biblatex のオプションで出来ない変更をする

フィールド(著者名,ジャーナル名,etc.)のフォーマットや表示順序を変える,URLなど以外のオプションで指定できないフィールドを非表示にするような変更はオプションの設定ではできない.これらはマクロを再定義する必要がある.これを説明するために biblatex の構造について簡単に解説する.

biblatex の style は次のような方針で定義されている. まず基本的なスタイルを定義した親スタイルを作成する.各スタイルはこの親スタイルの定義をマクロで書き換えることで定義する.
たとえば,numeric や alphabetic などのスタイル は standard という親スタイルをマクロで変更することで定義されている.また親スタイル standard はオプションで指定できない.

したがって,オプションでできない変更をする場合は,まず numeric などのスタイルを指定し,マクロで定義されている部分を(プリアンブルで)変更する方針をとることになる.

以下では,numeric を変更することを例にとって, フィールドのフォーマットや表示順序の変更,非表示などに限って変更方法を述べる.これ以外のことについては,たとえば以下は参考になるかもしれない.

フィールドの表示順序を変更する

親スタイル standard.bbx では,article のフィールドの表示順序は以下で定義されている(一部省略).

\DeclareBibliographyDriver{article}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/translator+others}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{title}%
  ...
  \usebibmacro{journal+issuetitle}%
  ...}

ここで numeric ではマクロは再定義されていないので,いまは基本的にこの  をみれば良いことに注意する.

また \DeclareBibliographyDriver{article} {…} を直接書き換えることは推奨されていない.詳しくは以下を参照.

Copy-pasting this definition to your local copy of biblatex.cfg and swapping the respective code lines should be a piece of cake, right? Wrong! While the "bibliography driver" shown above is functional (the example is taken from section 4.2.3 of the manual), the actual drivers are much more complex.
https://tex.stackexchange.com/questions/12806/guidelines-for-customizing-biblatex-styles

たとえば author の 後に year を表示したいとする. author の表示は \usebibmacro{author/translator+others} で,year の表示は \usebibmacro{journal+issuetitle} でコントロールされているからこれらのマクロを書き変れば良い.

マクロ journal+issuetitle は次のようになっている.これをみると year の表示は別のマクロ issue+date に投げられていることがわかる.さらに実際の表示は マクロ date で行われている.

# In https://github.com/plk/biblatex/blob/6bd085fd7123d100bdbd761454fdea00f396803c/tex/latex/biblatex/bbx/standard.bbx#L784
\newbibmacro*{journal+issuetitle}{%
  \usebibmacro{journal}%
  \setunit*{\addspace}%
  \iffieldundef{series}
    {}
    {\newunit
     \printfield{series}%
     \setunit{\addspace}}%
  \usebibmacro{volume+number+eid}%
  \setunit{\addspace}%
  \usebibmacro{issue+date}%
  \setunit{\addcolon\space}%
  \usebibmacro{issue}%
  \newunit}

\newbibmacro*{issue+date}{%
  \printtext[parens]{%
    \printfield{issue}%
    \setunit*{\addspace}%
    \usebibmacro{date}}%
  \newunit}

# In https://github.com/plk/biblatex/blob/eac99d8e453b2d09f14757000526bf1da3454c4d/tex/latex/biblatex/biblatex.def#L2931
\newbibmacro*{date}{\printdate}

journal+issuetitle を year を表示しないように(プリアンブルで)再定義する.

\renewbibmacro*{journal+issuetitle}{%
  \usebibmacro{journal}%
  \setunit*{\addspace}%
  \iffieldundef{series}
    {}
    {\newunit
     \printfield{series}%
     \setunit{\addspace}}%
  \usebibmacro{volume+number+eid}%
  \setunit{\addspace}%
  \usebibmacro{issue}%
  \newunit}

次に author/translator+others で year を表示するように変更する.author/translator+others は次のようになっている.

# In https://github.com/plk/biblatex/blob/eac99d8e453b2d09f14757000526bf1da3454c4d/tex/latex/biblatex/biblatex.def#L2418
\newbibmacro*{author/editor+others}{%
  \ifboolexpr{
    test \ifuseauthor
    and
    not test {\ifnameundef{author}}
  }
    {\usebibmacro{author}}
    {\usebibmacro{editor+others}}}

よってこれを以下のように変更する.

\renewbibmacro*{author/editor+others}{%
  \ifboolexpr{
    test \ifuseauthor
    and
    not test {\ifnameundef{author}}
  }
    {\usebibmacro{author}}
    {\usebibmacro{editor+others}}
    {\usebibmacro{date}}}

フィールドのフォーマットを変更する

first name と last name の順序を入れ替える

この記事が気に入ったらサポートをしてみませんか?