日本語と英語の共存するbibtexのスタイルファイルを作る

# TLDR

- Bibtexで日本語文献と英語文献をそれぞれ別の表記で表示します
- スタイルファイルを改造して，元のbibファイルにちょっと調整を加えることで実現しました。
- **現在このプロジェクトはより精力的に開発しているehki氏に移譲しました**

https://github.com/ehki/jIEEEtran

本記事のコードはだいたいv0.10の時の内容になります。

# 背景
bibtexでTexの参考文献を自動生成するのは非常に便利なのですが，日本語と英語で異なる表記にしたい場合に非常に不便を被るという背景があります。学会というよりThesisなどで問題になってきますね。

以前，[こんな記事](https://qiita.com/ossyaritoori/items/b4b1afc451a76e3bc63e)を書いたところ，以下のように直接bstファイルを変更して対応するという方が現れました。

[日本語と英語を混ぜられるようにbibtexスタイルファイルを改造しよう](https://qiita.com/HexagramNM/items/3ad757a9f5ee5d15e363#_reference-2be0cc9a71381591bb17)

bstファイルの操作まわりについてわかりやすく解説してあって非常に助かります。

この方の解説に沿って[IEEEtranS.bst](http://tug.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex/IEEEtranS.bst)を元に日本語と英語を共存できるスタイルファイルを作成，リポジトリを作りました。


## 概要
- IEEEtranS のbstファイルを改造して日本語と英語で出力方法を分ける
- もとのbibファイルに日本語かどうかのフラグを建てる準備が必要（Pythonで自動化可）

引用元との違いはこちらは英語版の表記方法にフルネームではなく略称を使っているという所です。


## ソースコードと出力例

作成したbstファイルのソースコードは[こちら](https://github.com/ehki/jIEEEtran/tree/v0.10)になります。（より精力的に開発してくださったehki氏に権利を移管したため最新版は動作が異なるはずです。）


更新ポイントとして英語はIEEEの書式を維持したまま，日本語の著者名や文献周りのコントロール，カンマの全角半角などを切り替えられるようになりました。
![](https://github.com/YoshiRi/JPandENbst/raw/master/images/results.png)

## 使用方法
- 日本語版のbstファイル， `IEEEtranS_withJP.bst`を[github](https://github.com/YoshiRi/JPandENbst)からダウンロード
- もとのbibファイルに日本語かどうかのフラグを建てる（[Pythonで自動化可](https://qiita.com/ossyaritoori/items/efec1978b8a03c8cb737)）
- 作成したbstファイルを指定してコンパイル


# bstファイルの変更内容
当方bstファイルの文法や書式については完全にど素人です。

[先程の参考文献](https://qiita.com/HexagramNM/items/3ad757a9f5ee5d15e363#_reference-2be0cc9a71381591bb17)の記述以上のことは知りません。
詳しく書いてないところは参考文献の丸写しということなのでそちらを参照あれ。

以下[元ファイルのIEEEtranS.bst](http://tug.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex/IEEEtranS.bst)に対する変更点を書き連ねていきます。


## 日本語のみフルネーム表記へと変更する下準備
- 処理内容

`FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" }`のしたに，日本語用の表記を追記します。

```
% The default name format control string. %change based on japanese
FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" }
FUNCTION {default.name.format.string.forJP}{ "{ff~}{vv~}{ll}{, jj}" } %%追加箇所
```

- 意図解説

`FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" }`のうち，`{f.~}`がデフォルトの名前の表記を名字1文字+カンマに設定しています。これを以下のように`{ff~}`と変更すれば，名字をフルネームで書けるようになります。
（2020/1/12追記）なお`{ff ~}`としないと名字と名前の間をうまく開けてくれないことがあるらしいです。
`FUNCTION {default.name.format.string}{ "{ff ~}{vv~}{ll}{, jj}" } }`


しかし，これはデフォルトの設定を変えてしまうので英語のフォーマットを崩してしまいます。後の行を見ると実はinitializeの過程で`name.format.string`にこれを代入しているに過ぎません。ということで，後に追加する`japanese.flag`に応じてこれを変更するように書けばよいわけです。

- `name.format.string`への代入箇所

```bst
FUNCTION {initialize.controls}
{ default.is.use.number.for.article 'is.use.number.for.article :=
  default.is.use.paper 'is.use.paper :=
  default.is.use.url 'is.use.url :=
  default.is.forced.et.al 'is.forced.et.al :=
  default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al :=
  default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al :=
  default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing :=
  default.is.dash.repeated.names 'is.dash.repeated.names :=
  default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor :=
  default.name.format.string 'name.format.string := %%ここで代入されている
  default.name.latex.cmd 'name.latex.cmd :=
  default.name.url.prefix 'name.url.prefix :=
}
```






## フラグの追加

- bibファイルにisjapaneseフラグを追加。
- bstファイル内でフラグを管理するInteger`japanese.flag`に関する記述を追加。



## 日本語文献のカンマやピリオドの全角化，"の後にカンマが来るように変更
`FUNCTION {output.nonnull}`と` FUNCTION {fin.entry}`を変更。


## 日本語文献の複数著者の場合に出てきてしまうandの抑制
`FUNCTION{format.names}`の変更。

## 全ての文献形式にフラグを管理する処理を追加 + 日本語
bibにisjapaneseが{true}で入っていた場合に`japanese.flag`を立てる処理をします。
また，先程述べた日本語と英語での書式の変更もここでやってしまいます。


- `isjapanese`を探して`japanese.flag`を立てる。
- flagが1の時，日本語用の名前フォーマット`default.name.format.string.forJP`へと`name.format.string`を切り替える。
- 最後に`japanese.flag`を0に戻して，名前のフォーマットを英語用に戻す。

```
FUNCTION {article}
{ std.status.using.comma
  start.entry
  %%変更箇所1：日本語エントリに何かあれば日本語化するフラグを立てる
  isjapanese empty$ 
   {skip$} 
   {#1 'japanese.flag :=
   default.name.format.string.forJP 'name.format.string :=} 
 if$ 
  %%変更箇所1ここまで
  if.url.alt.interword.spacing
  format.authors "author" output.warn
  name.or.dash
  format.article.title "title" output.warn
  format.journal "journal" bibinfo.check "journal" output.warn
  format.volume output
  format.number.if.use.for.article output
  format.pages output
  format.date "year" output.warn
  format.note output
  format.url output
  fin.entry
  if.url.std.interword.spacing
  %%変更箇所2：次の文献のために日本語化フラグの解除(0に戻しておく)
  #0 'japanese.flag :=
  default.name.format.string 'name.format.string :=
  %%変更箇所2ここまで
}
```

これを`article`だけでなく全ての文章タイプに対して適用します。
置換をうまく使うのが効率的でしょう。


## bibファイルを準備する（article版）
もとにするbibファイルは以下のように `isjapanese = {true}`という行を追加しています。


```bib
@article{japaneseTest1,
 author = {山田 一郎 and 山田 次郎 and 山田 三郎 and 山田 四郎},
 year = {2019},
 journal = {日本語学会},
 title = {文献1},
 isjapanese = {true}
}
@article{japaneseTest2,
 author = {山田 五郎 and 山田 六郎},
 year = {2019},
 journal = {日本語学会},
 title = {文献2},
 isjapanese = {true}
}
@article{englishTest1,
 author = {Ichiro Yamada and Jiro Yamada and Saburo Yamada and Shiro Yamada},
 year = {2019},
 journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence},
 title = {Title1}
}
@article{englishTest2,
 author = {Goro Yamada and Rokuro Yamada},
 year = {2019},
 journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence},
 title = {Title2}
}
```

# bibファイルの編集
このbstファイルを使用するには日本語文献のbibファイルに`isjapanese = {true}`の項を追加する必要があります。自分はbibファイルはMendeleyで自動生成しているのですがMendeleyではパット見自作の要素を追加できなさそうに見えます。

従ってMendeleyの吐いたbibファイルをperlとかPythonとかで加工して2バイト文字があった行にこのフラグを挿入する的なPythonスクリプトを書きました。
以下の記事に続きます。
https://qiita.com/ossyaritoori/items/efec1978b8a03c8cb737#_reference-79bedf1a3479bcf2b595