BibTeXを用いた際，著者名の途中で改行されるのを.bstファイルをいじることで止めさせる方法

## 注意
筆者はbstファイルをはじめていじったので，結果うまくいっているように見えているだけで理屈はよく分かっていません．また，少なくとも筆者が見た限りでは例外が発生していないだけなので，完璧に動作するという自信はありません．本稿をお読みになった諸先輩方のご指摘やご説明のほどをお待ちしております．

## 目的
BibTeXを利用した時，適当なスタイルで参考文献欄を書くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4069452/e9d971c9-a6f0-4b38-8033-62ec50c7fba9.png)
こんな感じで著者名の途中で勝手にハイフネーションされるのを防ぎたい（Gourianovさん勝手に使ってごめんなさい）．
一番簡単なのはbibファイルをいじって
~~~ bib:1360017286855747584.bib
@article{1360017286855747584,
author="Nikita,~Gourianov and Michael,~Lubasch and Sergey,~Dolgov and Quincy~Y.~van~den~Berg and Hessam,~Babaee and Peyman,~Givi and Martin,~Kiffner and Dieter,~Jaksch",
title="A quantum-inspired approach to exploit turbulence structures",
journal="Nature Computational Science",
ISSN="2662-8457",
publisher="Springer Science and Business Media LLC",
year="2022",
month="01",
volume="2",
number="1",
pages="30-37",
DOI="10.1038/s43588-021-00181-1",
URL="https://cir.nii.ac.jp/crid/1360017286855747584"
}
~~~
のように人名の前に~や\nobreakを入れる方法であるが，10本も100本も引用するつもりだったら面倒なので，bstファイル（BibTeXでの引用スタイルを決めるファイル）の方をいじって改行しないようにしたい．

## 方法
最初に書いた通り，筆者は理屈もよくわかっていないし，ググっても該当の修正方法が出てこないしで行き当たりばったりだったので，とりあえずやり方と結果だけ．

### 1. bstファイルの"FUNCTION {format.names}"から始まる部分を探す
例えばこんな感じになっているところ（以下はjplain.bstより抜粋）．
~~~
FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }

    { s nameptr "{ff}{ll}" format.name$ is.kanji.str$
	{s nameptr "{ff}{ll}" format.name$ 't :=}
 	{s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=}
      if$

      nameptr #1 >
	{ namesleft #1 >

	    {", " * t * }


	    { t "others" =

 		{ s is.kanji.str$

 			{"ほか" * }


 			{", et~al." * }

 		  if$
 		}
 		{ s is.kanji.str$

 		    {", " * t * }



		    { numnames #2 =
 			{" and " * t * }
 			{", and " * t * }
		      if$
		    }


 		   if$
 		}
	      if$
	    }
	  if$
	}
	't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}
~~~

### 2. "{ff~}{vv~}{ll}{, jj}" みたいなことが書いてあるところを置き換える
bstファイルのいじり方自体はググれば結構出てきて，この部分では著者名をどう記述するかを決めているらしい．詳細については省略するが，この状態だと"First_name Middle_name Last_name, Jr."みたいに何も省略せずに出てくるらしい．
この部分をこういじる．
~~~
FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }

    { s nameptr "{ff~}{ll~}" format.name$ is.kanji.str$
	{s nameptr "{ff}\ \nobreak {ll}" format.name$ 't :=}
 	{s nameptr "\nobreak {ff}{~vv}\ \nobreak {ll}\nobreak {,~jj}" format.name$ 't :=}
      if$

      nameptr #1 >
	{ namesleft #1 >

	    {", " * t * }


	    { t "others" =

 		{ s is.kanji.str$

 			{"ほか" * }


 			{" et~al." * }

 		  if$
 		}
 		{ s is.kanji.str$

 		    {", " * t * }



		    { numnames #2 =
 			{"\ and " * t * }
 			{", and " * t * }
		      if$
		    }


 		   if$
 		}
	      if$
	    }
	  if$
	}
	't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}
~~~
変更した点は3つ．
- 9行目の"{ff}{ll}"を"{ff}\ \nobreak {ll}"に置き替え
- 10行目の"{ff~}{vv~}{ll}{, jj}"を"\nobreak {ff}{~vv}\ \nobreak {ll}\nobreak {,~jj}"に置き替え
- 37行目の" and "を"\ and "に置き替え
簡単に言うと，~（改行させないスペースのはず）が語頭に来てもなぜか改行されてしまうので，\nobreakで明確に禁止させる．
3つ目の変更点は，~から\nobreakに変更したことによるスペース不足を補うため．

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4069452/3babad44-9d6e-4d4f-a683-3cc068567867.png)
頑張ればFirst nameとLast nameの間で改行することも禁止できるが，そこまでしてしまうとスペースが増えてしまい逆に読みにくいのでここまで．

## 参考文献（例示に使っただけ）
Gourianov, N., Lubasch, M., Dolgov, S. et al. A quantum-inspired approach to exploit turbulence structures. Nat Comput Sci 2, 30–37 (2022). https://doi.org/10.1038/s43588-021-00181-1