文献に英語と日本語が混在する論文などをTeXで書くための一つのやり方

# はじめに

TeXを使って論文などの学術的な文章を書くとき、英語と日本語の文献の両方を扱いつつ正確に文献情報を掲載しようとすると、いろいろな困難が伴います。

特に、[Chicago Manual of Style](https://www.chicagomanualofstyle.org)（以下CMOS）のように細かく定められた引用スタイルを採用しようとすると、手作業での修正が多数発生し、煩雑になってしまうことがあるかと思います。

この記事では、私が自分で使用するために開発した1つの解決策を紹介してみたいと思います。

『テクノロジーの〈解釈学〉』という長めの論考の草稿で用いた例はこちらです。

https://researchmap.jp/mayfair/published_works

今回採用したCMOS（Notes and Bibliography）のサンプルはこちらに掲載されています。

https://www.chicagomanualofstyle.org/tools_citationguide/citation-guide-1.html


なお、ここで紹介する方法は以下のような環境での使用を想定していますが、他の環境でも応用できます。

- XeLaTeX
- [Zotero](https://www.zotero.org/)

# 準備

## 環境構築

まず、必要なツールをインストールしましょう。

中心となるのは、Citation Style Language（CSL）の非公式多言語拡張仕様である[CSL-M](https://citeproc-js.readthedocs.io/en/latest/csl-m/index.html)に対応したプロセッサ「[citeproc-lua](https://github.com/zepinglee/citeproc-lua)」です。そのLaTeXパッケージ「citation-style-language.sty」は、TeX Live 2024（およびそれを基にしたMacTeX 2024など）に含まれています。citeproc-luaは発展途上にあるため、例えば次のようにするなどして更新しておきましょう。

```shell-session
sudo tlmgr update --self --all
```

もし、何らかの事情でアップデートできない場合には、リポジトリの[説明](https://github.com/zepinglee/citeproc-lua?tab=readme-ov-file#installation)に従ってインストールしましょう。

次に、日本語と英語の両方に対応したCSLファイル「[chicago-fullnote-bibliography-short-title-subsequent-ja.csl](https://github.com/kotobuki/chicago-fullnote-bibliography-short-title-subsequent-ja-csl)」をダウンロードして適切な場所に配置します。

このほか、（もしまだであれば）[Better BibTeX](https://www.zotero.org/)をインストールしましょう。

## 文献ファイルの準備

次に、文献ファイルを準備しましょう。

1. コレクションを右クリック→メニューから［Export Collection...］を選択
2. Formatに「Better CSL JSON」を選択→［OK］ボタンをクリックして出力する

# 使い方

## TeXソース

例を以下に示します。ファイル名などはそれぞれの環境に合わせて変更してください。

```latex
% 日本語を使用するための設定
\documentclass[a4paper,xelatex,ja=standard]{bxjsarticle}

% TeXでCSLファイルを使用するための設定
\usepackage{citation-style-language}
\cslsetup{style = chicago-fullnote-bibliography-short-title-subsequent-ja.csl}
\cslsetup{locale = en}

% 文献ファイルを指定
\addbibresource{example.json}

\begin{document}

% 引用
D’Arcusは〜と報告した \cite{ITEM-1}。

% 文献目録を出力
\printbibliography

\end{document}
```

## コンパイル

```shell
xelatex example.tex
citeproc-lua example.aux
xelatex example.tex
```

# 後処理

上記では対応できない次のようなケースがあります。本当はもっとエレガントな解決法を採用したいのですが、今のところ見つからないため、暫定的にZoteroで文献を登録する際に若干特殊な入力方法を採用しつつ、Pythonスクリプトで後処理をかけることで対応します。

## 著者名のカタカナ表記における中黒

次のように入力する。

`(last)` キム
`(first)` ・チョヨプ

なお、ラテン系の著者名等はそのままアルファベットで記載することを想定しているため、ここで対象となるのは韓国など「姓・名」の順で記載する場合に限定されます。

## 編著者

「Author」を選択した上で、最後の編著者に`：編著`をつけます。

`(last)` 鈴木
`(first)` 真紀：編著

## 監訳者

「Translator」を選択した上で、最後の監訳者に`：監訳`をつけます。

`(last)` 鈴木
`(first)` 真紀：監訳

## その他

上記そのままだと、監訳の場合鈴木真紀：監訳：翻訳のようになってしまうだけでなく、書名における区切りやURLの表示など、いくつかの問題があります。これらを解決するために、次のPythonスクリプトを使用します。

その他に次のような問題がある。これらについてスクリプト上で対応する。

- 書名における区切りなど意図的に入れた半角スペースが無視されてしまう
- `\bibitem`タグで始まるセクションにおいて、その内部のURLに`\url`タグが適用されない
- `\cslcitation`タグで始まるセクションにおいて次のような問題がある
  - `』`の後に不要な`、`が入ってしまう
  - `」、『`になるべきところが`」『` になってしまう（書籍に収録された論文など）
  - `」…：訳`となるべきところが `」、…：訳` になってしまう（書籍ではなく論文の翻訳者）

## Pyhtonスクリプト

次のスクリプトで、`.bbl`ファイルを書き換えます。

```python:update_bbl.py
import re
import sys
import shutil


def update_bbl_content(content):
    # 日本語文字の後の単一スペースに \mbox{ } を挿入
    # Unicode範囲を考慮し、日本語（漢字、ひらがな、カタカナ）、及び全角記号を対象とする
    content = re.sub(
        r"([\u3000-\u303F\u4E00-\u9FFF\u3040-\u309F\u30A0-\u30FF]) ([\u3000-\u303F\u4E00-\u9FFF\u3040-\u309F\u30A0-\u30FF])",
        r"\1\\mbox{ }\2",
        content,
    )

    # `\cslcitation` 内の `』、` を `』` に置換
    content = re.sub(r"(\\cslcitation\{[^}]*\}.*?『[^』]*)(』)、", r"\1\2", content, flags=re.DOTALL)

    # `\cslcitation` 内の `」、…：訳` を `」…：訳` に置換
    content = re.sub(r"(\\cslcitation\{[^}]*\}.*?)」、([^」]*：訳)", r"\1」\2", content, flags=re.DOTALL)

    # `\cslcitation` 内の `」『` を `」、『` に置換
    content = re.sub(r"(\\cslcitation\{[^}]*\}.*?)」『", r"\1」、『", content, flags=re.DOTALL)

    # `\cslcitation` 内の `：監訳：訳` を `：監訳` に置換
    content = re.sub(r"(\\cslcitation\{[^}]*\}.*?)：監訳：訳", r"\1：監訳", content, flags=re.DOTALL)

    # `\bibitem` 内の `：監訳：翻訳` を `：監訳` に置換
    content = re.sub(r"(\\bibitem\{[^}]*\}.*?)(：監訳)：翻訳", r"\1\2", content, flags=re.DOTALL)

    # `\bibitem`タグで始まるセクションを見つけ、その内部のURLだけを変換
    content = re.sub(
        r"(\\bibitem\{[^}]*\}.*?)(\\url\{([^}]*)\})",
        lambda match: match.group(1) + r"\texttt{" + match.group(2) + "}",
        content,
        flags=re.DOTALL,
    )

    return content


def process_bbl_file(filename):
    # ファイルを読み込む
    with open(filename, "r", encoding="utf-8") as file:
        content = file.read()

    # 内容を更新
    updated_content = update_bbl_content(content)

    # オリジナルのファイルをバックアップ
    shutil.copy(filename, filename + ".org")

    # 更新された内容をファイルに書き込む
    with open(filename, "w", encoding="utf-8") as file:
        file.write(updated_content)


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python update_bbl.py filename.bbl")
        sys.exit(1)

    filename = sys.argv[1]
    process_bbl_file(filename)
```

## コンパイル

全ての処理をまとめると次のようになります。

```shell
xelatex example.tex
citeproc-lua example.aux
python3 update_bbl.py example.bbl
xelatex example.tex
```

# おわりに

この記事で紹介したやり方を使えば、英語と日本語の文献が混在する文献の取り扱いがある程度楽になるはずです。必要とする人は限定的かもしれませんが、該当する方はぜひ試してみてください。また、もっとよいやり方をご存じの方がいらっしゃったら、コメントなどでお知らせいただければ幸いです。

https://github.com/kotobuki/chicago-fullnote-bibliography-short-title-subsequent-ja-csl