Help us understand the problem. What is going on with this article?

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

背景

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

以前,こんな記事を書いたところ,以下のように直接bstファイルを変更して対応するという方が現れました。

日本語と英語を混ぜられるようにbibtexスタイルファイルを改造しよう

この方の解説に沿ってIEEEtranS.bstを元に日本語と英語を共存できるスタイルファイルを作成,リポジトリを作りました。

リポジトリと出力イメージ

ソースコードはこちらになります。
https://github.com/YoshiRi/JPandENbst

英語はIEEEの書式を維持したまま(更新ポイント),日本語の著者名や文献周りのコントロール,カンマの全角半角などを切り替えられるようになりました。

やったこと

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

先程の参考文献の記述以上のことは知りません。
詳しく書いてないところは参考文献の丸写しということなのでそちらを参照あれ。

以下元ファイルのIEEEtranS.bstに対する変更点を書き連ねていきます。

日本語のみフルネーム表記へと変更する下準備

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

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

  • name.format.stringへの代入箇所
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 :=
}

従って私の手法では,とりあえず次のように別の変数を立てるようにします。

% 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}" } %%追加箇所

フラグの追加

  • bibファイルにisjapaneseフラグを追加。
  • bstファイル内でフラグを管理するIntegerjapanese.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}という行を追加しています。

@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ファイルにisjapanese = {true}を追加するのが非常にだるいです。bibファイルはMendeleyで自動生成しているのですがMendeleyではパット見自作の要素を追加できなさそうに見えます。

従ってMendeleyの吐いたbibファイルをperlとかPythonとかで加工して2バイト文字があった行にこのフラグを挿入する的なことができれば良いのかなと思います。

追記:Pythonスクリプトを書きました。ADHDなのでこういうのは早い。
https://qiita.com/ossyaritoori/items/efec1978b8a03c8cb737#_reference-79bedf1a3479bcf2b595

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away