diff options
Diffstat (limited to 'Master/texmf-dist/doc/ptex/pbibtex')
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/README | 66 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/cpp.awk | 104 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/generate.sh | 21 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/jbibtex.bib | 39 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/jbibtex.tex | 674 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/jbtxbst.doc | 3762 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.bib | 116 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.tex | 1091 | ||||
-rw-r--r-- | Master/texmf-dist/doc/ptex/pbibtex/jbtxhak.tex | 691 |
9 files changed, 6564 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/ptex/pbibtex/README b/Master/texmf-dist/doc/ptex/pbibtex/README new file mode 100644 index 00000000000..484c51e91dd --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/README @@ -0,0 +1,66 @@ +JBibTeXの使い方(BibTeXとの相異点)については、以下に付けた +「JBibTeX(C Version) ver. 0.30 の概要」からの抜粋をまず読んで +下さい。さらに詳しく知りたいときは、このdirectoryにあるjbibtex.tex +を読んで下さい。 + +------------ +「JBibTeX(C Version) ver. 0.30 の概要 1991-1-2 + (財)電力中央研究所 情報システム部 松井 正一」 +からの抜粋 + +【始めに】 + + JBibTeX は BibTeX 0.99c(C Version) を基に NTT版JTeX, ASCII版日本語TeXのどち +らにも対応して日本語化したものである. + + 主な変更は以下の通りである. + + (1) 漢字コードは内部的には EUC で表現する.ファイルから一行を読み込む時点で, + EUC ならそのまま, JIS 漢字は EUC にコード変換する. + 端末,ファイルへの出力コード系は,コンパイル時に指定するが, + 利用者単位にも,それぞれ次の環境変数で指定できる. + 端末 BIBTERMCODE + ファイル BIBFILECODE + 指定は,NTT版 JTeXの \kanjitermicalcode, \kanjifilecode と同じ, + 1,2,3,4,5,6,10(SJIS),20(EUC) + で行う.MS-DOS 版では SJIS がデフォルトの設定で exe が作成してある. + + (2) 漢字コードを通すように BibTeX の Chage File を変更して, 文字を 7bits から + 8bits に変更した(これに合せて bibext.c も変更されている). + + (3) 組込み関数の中で substring$, text.prefix$ に対しては, + 1単位の漢字コードの間で(1バイト目と2バイト目の真ん中で)文字列が分断され + ないようにした. + 例えば,"漢字" の先頭から 3 文字を抜出すと "字"の 2バイト目がなくなって + しまうので,このような場合には,4バイト目まで切出すようにした. + + (4) (3)との関係で, chr.to.int$ は stack top が漢字ならば single character + でなくても warning を出さず, 1byte 目の値を返すようにした. + + (5) 漢字コードを含む文字列であるかどうかの判定用に,組み込み関数として + is.kanji.str$ を追加した. + + (6) add.period$ 関数では `!', `?', `.' の後には,`.' を付け加えないので, + 対応する全角文字の `!', `?', `.', `。' の後にも `.' を付け加えない + ようにした. + + (7) 複数氏名は " and " を間にはさんで並べるが,漢字氏名の場合には " and " + の代わりに,全角の句点 `,', `、' を使ってもよいようにした. + (この変更により,影響を受ける関数は format.name$ と num.names$ 関数) + + (8) ver. 0.20 までは,漢字氏名の姓と名の区切りとしては半角のスペースしか + 許していなかったが,全角のスペースでもよいようにした. + + (9) bib file の項目のどこに漢字コードを使ってよいかは, test.bib などを参照 + されたい. + +(10) bib ファイル中の漢字著者名の姓と名の間にはスペース(半角でも全角でも)を + 置くことを標準とした(なくても問題ないが,結果がちゃんとならないことが + あるし,警告メッセージが出力される). + +(11) 文献スタイルとして plain, abbrv, alpha, unsrt に対応する日本語対応 + スタイルとして, jplain, jabbrv, jalpha, junsrt が用意されている.また + 情報処理学会論文誌(tipsj), 英文論文誌(jipsj), 電子情報通信学会論文誌 + (tieice), 日本オペレーションズリサーチ学会論文誌(jorsj) 用のスタイルも + 用意されている. + diff --git a/Master/texmf-dist/doc/ptex/pbibtex/cpp.awk b/Master/texmf-dist/doc/ptex/pbibtex/cpp.awk new file mode 100644 index 00000000000..4c281373326 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/cpp.awk @@ -0,0 +1,104 @@ +function do_if(proc,sym, direct ) { + if( (sym in defined) && (defined[sym]!=0 ) ) { + while( direct!="else" && direct!="endif" ) direct=proc_line(proc) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(0) + } else { + while( direct!="else" && direct!="endif" ) direct=proc_line(0) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(proc) + } +} + +function do_if_not(proc,sym, direct ) { + if( (!(sym in defined)) || (defined[sym]==0 ) ) { + while( direct!="else" && direct!="endif" ) direct=proc_line(proc) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(0) + } else { + while( direct!="else" && direct!="endif" ) direct=proc_line(0) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(proc) + } +} + +function do_ifdef(proc,sym, direct ) { + if( sym in defined ) { + while( direct!="else" && direct!="endif" ) direct=proc_line(proc) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(0) + } else { + while( direct!="else" && direct!="endif" ) direct=proc_line(0) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(proc) + } +} + +function do_ifndef(proc,sym, direct) { + if( !(sym in defined) ) { + while( direct!="else" && direct!="endif" ) direct=proc_line(proc) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(0) + } else { + while( direct!="else" && direct!="endif" ) direct=proc_line(0) + if(direct=="else") + while( direct!="endif" ) direct=proc_line(proc) + } +} + +function proc_line(proc, direct) { + if( (getline<"jbtxbst.doc") <1 ) { + exit + } + lno++; + if( $0 ~ /^#/ ) { + if( $1=="#" ) { + direct=$2; arg1=$3; arg2=$4 + }else { + direct=substr($1,2,16); arg1=$2; arg2=$3 + } + if(direct=="define") { + if(proc) defined[arg1]=arg2+0 + } else if(direct=="ifdef" ){ + do_ifdef(proc,arg1) + }else if(direct=="ifndef") { + do_ifndef(proc,arg1) + }else if(direct=="if") { + if( substr(arg1,1,1)=="!" ) do_if_not(proc,substr(arg1,2,32)) + else do_if(proc,arg1) + }else if( (direct!="else") && (direct!="endif") ){ + print "% Error **undefined **",direct,"** in line",lno >"/dev/tty" + exit + } + return direct; + }else if($0 ~ /^%/ ) { + return "" # コメントは基本的には削除する + }else if($0 ~ /^ %/ ) { + sub(/ /,"") # この形式のコメントは出力する + print $0 + return "" + }else { + if(proc) print $0 + return "" + } +} +BEGIN{ + if(ARGC<2) { + print "usage: gawk -f cpp.awk <style-type> [<option>]" + print "<style-type> = JPLAIN | JALPHA | JABBRV | JUNSRT | JIPSJ" + print " TIPSJ | TIEICE | JNAME | JORSJ" + print "<option> = ASCII" + exit + } + opt=ARGV[1] + name["JPLAIN"]="jplain"; name["JALPHA"]="jalpha"; name["JABBRV"]="jabbrv" + name["JUNSRT"]="junsrt"; name["JIPSJ" ]="jipsj" ; name["TIPSJ" ]="tipsj" + name["TIEICE"]="tieice"; name["JNAME" ]="jname" ; name["JORSJ" ]="jorsj" + if( opt in name ) + printf("%% JBibTeX standard bibliography style `%s'\n",name[opt]) + for(i=1;i<ARGC;i++) { + defined[ARGV[i]]=1 + ARGV[i]="" + } + while(1) proc_line(1) +} diff --git a/Master/texmf-dist/doc/ptex/pbibtex/generate.sh b/Master/texmf-dist/doc/ptex/pbibtex/generate.sh new file mode 100644 index 00000000000..118fc18fabb --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/generate.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# use cpp +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DJPLAIN >jplain.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc | /lib/cpp -P -DJALPHA >jalpha.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DJUNSRT >junsrt.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DJABBRV >jabbrv.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DJIPSJ >jipsj.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DTIPSJ >tipsj.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DTIEICE >tieice.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DJNAME >jname.bst +sed -e '/^%/d' -e '/^$/d' jbtxbst.doc |/lib/cpp -P -DJORSJ >jorsj.bst +# use gawk +#gawk -f cpp.awk JPLAIN >jplain.bst +#gawk -f cpp.awk JALPHA >jalpha.bst +#gawk -f cpp.awk JUNSRT >junsrt.bst +#gawk -f cpp.awk JABBRV >jabbrv.bst +#gawk -f cpp.awk JIPSJ > jipsj.bst +#gawk -f cpp.awk TIPSJ > tipsj.bst +#gawk -f cpp.awk TIEICE >tieice.bst +#gawk -f cpp.awk JNAME > jname.bst +#gawk -f cpp.awk JORSJ > jorsj.bst diff --git a/Master/texmf-dist/doc/ptex/pbibtex/jbibtex.bib b/Master/texmf-dist/doc/ptex/pbibtex/jbibtex.bib new file mode 100644 index 00000000000..e4aff3bb7cc --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/jbibtex.bib @@ -0,0 +1,39 @@ +@BOOK{texbook, + author = "Donald E. Knuth", + title= "The {{\TeX}book}", + publisher = "Addison-Wesley", + year = 1984 } + +@BOOK{latex, + author = "Leslie Lamport", + title = "{\LaTeX \rm:} {A} Document Preparation System", + publisher = "Addison-Wesley", + year = 1986, + note="(邦訳:『文書処理システム (\LaTeX)』 Edgar Cooke, 倉沢 良一 監訳, + 大野 俊治, 小暮 博道, 藤浦 はる美 訳, アスキー, 1990年)" + } + +@UNPUBLISHED{btxdoc, + author = "Oren Patashnik", + title = "{{\BibTeX ing}}", + note = "Documentation for general {\BibTeX} users", + month = jan, + year = 1988 } + +@UNPUBLISHED{btxhak, + author = "Oren Patashnik", + title = "Designing {\BibTeX} Styles", + note = "The part of \BibTeX's documentation + that's not meant for general users", + month = jan, + year = 1988 } + +@BOOK{jeng, + author="マーク・ピーターセン", + title="日本人の英語", + publisher="岩波書店", + year=1988, + pages=196, + yomi="Mark Petersen", + series="岩波新書(新赤版) 18", +} diff --git a/Master/texmf-dist/doc/ptex/pbibtex/jbibtex.tex b/Master/texmf-dist/doc/ptex/pbibtex/jbibtex.tex new file mode 100644 index 00000000000..8c65536b4f4 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/jbibtex.tex @@ -0,0 +1,674 @@ +\documentstyle[tables]{j-article} +\postkinsoku `` +\parindent=\jspaceskip +\voffset=-0.4cm +\hoffset=-0.3cm +\textheight=26.0cm +\textwidth=16.0cm +\jintercharskip=0pt plus 0.5pt minus 0.5pt + +\def\JTeX{\leavevmode\lower .5ex\hbox{J}\kern-.17em\TeX} +\def\JLaTeX{\leavevmode\lower.5ex\hbox{J}\kern-.17em\LaTeX} + +\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em + T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} + +\def\JBibTeX{\leavevmode\lower .6ex\hbox{J}\kern-0.15em\BibTeX} + +\def\myftnote#1{\footnote{\parindent=16pt\hskip-15pt\hang\indent#1\parindent=10pt}} + + +\def\tstrut{\vrule height 2.346ex depth 0.908ex width 0pt} +\thicksize=0.7pt +\thinsize=0.3pt + +\setcounter{topnumber}{3} +\setcounter{bottomnumber}{3} +\setcounter{totalnumber}{6} +\renewcommand{\topfraction}{0.99} +\renewcommand{\bottomfraction}{0.99} +\renewcommand{\textfraction}{0.01} + +\title{日本語\BibTeX :\JBibTeX} +\author{松井 正一 {\tt\ (matsui@denken.or.jp)}\\ +\normalsize (財)電力中央研究所 情報システム部 (〒100 千代田区大手町1-6-1) } +\date{1991年1月1日} +\begin{document} +\baselineskip=14pt + +\maketitle + +\begin{abstract} + +\JBibTeX は\BibTeX\ 0.99cを基に +{\tt bib, bst}ファイル中に漢字コードを使えるように変更を加えたものである. + +このメモでは,先ず最初に\BibTeX の概要を簡単に説明した後, +日本語化に対しての基本的な考え方,主な変更点, +日本語に対応するように作成したスタイルについて +説明する. +\end{abstract} + +\section{はじめに} + +\TeX をNTTの斉藤氏が日本語化してくれたおかげで\TeX で +日本語が使えるようになった\myftnote{ICOTの高木氏(現在日立),都立大の +桜井氏の力に負うところも大きい.}.またNTTの磯崎氏が\LaTeX の +日本語版 \JLaTeX を作ってくれたので, +簡単に日本語のタイプセットができるようになった\myftnote{最初に開発した +\JBibTeX はNTT版を想定していたので,ASCII版に対する記述がないだけで, +他意はない.現在はNTT版,ASCII版の両方を使っている.}. + +技術系の文書を書く場合には,参考文献の管理に手間取ることが多い. +この手間を軽減するためのプログラムとして\LaTeX には,{\tt roff} +一族の{\tt refer}に対応した +\BibTeX があるが,この日本語化ができて +いなかったので\myftnote{1988年4月に,高木氏 +から\JTeX~in C のテープを入手した時点で.またASCIIバージョンを知らなかった +ので.}, +\JLaTeX の機能を活かしきれないきらいがあった\myftnote{私は面倒くさい +ことは嫌いなので.}. +そこで,とりあえず日本語を使える形の\BibTeX を\JBibTeX という形で +作成してみた. + +\section{\BibTeX の概要} + +\subsection{処理の流れ} +\BibTeX は\LaTeX で作成される{\tt aux}ファイル\myftnote{ファイルの +エクステンションでファイル名を代表する.}中 +の\verb|\citation|に示されて +いる\verb|\cite|項目に対応する参考文献レコードを\LaTeX の +文書中に\verb|\bibliography|で指定されたデータベースファイル +({\tt bib})から検索し, +\verb|\bibliographystyle|で指定された参考文献 +書式(スタイル)で{\tt bbl}ファイルに書き出す形で動作する.実行時の +メッセージは端末に出力されると同時に,ログファイルの{\tt blg}ファイルにも +出力される. + +通常はある文書{\tt file.tex}を処理するには次のような +手順をふむ\myftnote{{\tt bbl}ファイルの内容が固定された後は,{\tt latex}を +起動するだけでよい(相互参照関係の処理のために2回以上の起動が必要な +こともある).}. + +\newcounter{myn} +\begin{list}% +{\arabic{myn}.}{\usecounter{myn} +\setlength{\parsep}{1pt} +\setlength{\itemsep}{1pt} +\setlength{\topsep}{1pt} +} +\item {\tt latex file}で{\tt aux}を作り出す. +\item {\tt bibtex file}で{\tt aux, bib}から{\tt bbl}ファイルを作り出す. +\item 以後の{\tt latex file}の起動で{\tt bbl}が自動的に読み込まれる. +\end{list} + +\subsection{参考文献データベース} +データベース中の参考文献レコードは,文献の形式(論文,本など)を指定した +後に,引用キー,書誌項目を ``キーワード=値'' の形でカンマで区切って +並べる形で記述する\cite{latex,btxdoc}. +\newpage +文献の形式としては以下が用意されている. +\begin{table}[h] +\begintable +{\dg 文献の形式}|{\dg 説\hskip2cm 明}\hfil\crthick +{\tt article}\hfill| 論文誌など発表された論文\hfill\cr +{\tt book}\hfill | 出版社の明示された本\hfill\cr +{\tt booklet}\hfill | 印刷,製本されているが出版主体が不明なもの\hfill\cr +{\tt conference}\hfill | inproceedingsと同じ(Scribeとの互換性のため)\hfill\cr +{\tt inbook}\hfill | 書物の一部(章,節,文など何でも)\hfill\cr +{\tt incollection}\hfill | それ自身の表題を持つ,本の一部分\hfill\cr +{\tt inproceedings\ }\hfill | 会議録中の論文\hfill\cr +{\tt manual}\hfill | マニュアル\hfill\cr +{\tt masterthesis}\hfill | 修士論文\hfill\cr +{\tt misc}\hfill | 他のどれにも当てはまらない時に使う\hfill\cr +{\tt phdthesis}\hfill | 博士論文\hfill\cr +{\tt proceedings}\hfill | 会議録\hfill\cr +{\tt techreport}\hfill | テクニカルレポート\hfill\cr +{\tt unpublished}\hfill | 正式には出版されていないもの\hfill\endtable +\end{table} + +それぞれで必須な項目(フィールド)がある. + +項目(フィールド)としては以下がある\myftnote{正確にはplain, alpha, +abbrv, unsrtで,annoteを除いた項目が意味を持つ(タイプセットに +使われる).}. +\begin{table}[h] +\begintable +{\dg フィールド名}|{\dg 説\hskip2cm 明}\hfil\crthick +{\tt address}\hfill | 出版主体の住所\hfill\cr +{\tt annote}\hfill | 注釈付きのスタイルで使われる\hfill\cr +{\tt author}\hfill | 著者名\hfill\cr +{\tt booktitle}\hfill | 本の名前\hfill\cr +{\tt chapter}\hfill | 章,節などの番号\hfill\cr +{\tt crossref}\hfill | 相互参照する文献のデータベースのキー\hfill\cr +{\tt edition}\hfill | 本の版\hfill\cr +{\tt editor}\hfill | 編集者\hfill\cr +{\tt howpublished\ }\hfill | どのようにしてこの奇妙なものが発行されたか\hfill\cr +{\tt institution}\hfill | テクニカルレポートの発行主体\hfill\cr +{\tt journal}\hfill | 論文誌名\hfill\cr +{\tt key}\hfill | 著者名がない時に相互引用,ラベル作成などに使われる\hfill\cr +{\tt month}\hfill | 発行月,または書かれた月\hfill\cr +{\tt note}\hfill | 読者に役立つ付加情報\hfill\cr +{\tt number}\hfill | 論文誌などの番号\hfill\cr +{\tt organization\ }\hfill | 会議を主催した機関名あるいはマニュアルの出版主体\hfill\cr +{\tt pages}\hfill | ページ(範囲)\hfill\cr +{\tt publisher}\hfill | 主版社(者)名\hfill\cr +{\tt school}\hfill | 修士,博士論文が書かれた大学名\hfill\cr +{\tt series}\hfill | シリーズ,あるいは複数巻の本の名前\hfill\cr +{\tt title}\hfill | 表題\hfill\cr +{\tt type}\hfill | テクニカルレポートの種類\hfill\cr +{\tt volume}\hfill | 論文誌,複数巻の本の巻\hfill\cr +{\tt year}\hfill | 発行年,または書かれた年\hfill\endtable +\end{table} +\newpage + +以下にデータベースの記述例を示す. + +{\baselineskip=11pt +\begin{quote} +\begin{verbatim} + @ARTICLE{la, + author="Masao Iri and Kazuo Murota and Shouichi Matsui", + title="Linear-time approximation algorithms for finding the + minimum-weight perfect matching on a plane", + journal=ipl,volume=12,pages="206--209",year=1981 + } +\end{verbatim} +\end{quote} +} + +頻繁に使われる論文誌名などは,({\tt bst}ファイル中に)後述のマクロ機能を使って +省略形を定義しておくことで,{\tt journal=ipl}などと書ける({\tt bib}ファイル +中に{\tt @STRING(ipsj=\{情報処理学会\})}のように定義することもできる). + +\subsection{スタイル} +スタイルは{\tt alpha.bst}などのスタイルファイルに記述されている. +スタイルファイル中の書式は,スタックマシンに対しての命令を +後置演算子記法で記述した形である\cite{btxhak}. + +スタイルを記述する言語には二種類の関数がある.一つはシステム組み込みの +ものであり,{\tt newline\$, write\$} などのように名前の最後が{\tt `\$'}で +終る.もう一つは{\tt MACRO, FUNCTION}を使って定義するものである. + +組み込み関数には以下のようなものがある(全部で37ある). + +\begin{table}[h] +\parasize=9.68cm +\begintable +{\dg\bf 組み込み関数(名)\ }|{\dg 機\hskip2cm 能}\hfil\crthick +{\tt >, <, =} \hfill | \para{整数の比較}\cr +{\tt +, -}\hfill |\para{整数加算,減算}\cr +{\tt *}\hfill | \para{文字列の連結}\cr +{\tt :=}\hfill |\para{代入}\crthick +{\tt add.period\$}\hfill|\para{文字列の{\tt `\}'}でない最後の文字が, +{\tt `.', `?', `!'}のいずれでもなければ{\tt `.'}を最後に付加する}\cr +{\tt call.type\$}\hfill|\para{エントリの型(文献の型)に応じた関数を呼び出す. +例えば{\tt book}なら関数{\tt book}を呼び出す.}\cr +{\tt change.case\$}\hfill | \para{指定に応じて大文字, +小文字に変換した文字列を返す(指定が{\tt `t'}なら +最初の文字以外をすべて小文字に,{\tt `l'}ならすべて +小文字に,{\tt `u'}ならすべて大文字に変換する).}\cr +{\tt chr.to.int\$}\hfill |\para{1文字のみの文字列のASCIIコードを返す}\cr +{\tt text.prefix\$}\hfill | \para{高々指定された文字数 +以内の先頭文字列を返す}\cr +{\tt skip\$}\hfill | \para{何もしない}\cr +{\tt substring\$}\hfill | \para{部分文字列を返す}\cr +{\tt write\$}\hfill | \para{文字列を{\tt bbl}ファイルに書き出す} \endtable +\end{table} + +スタイルは前述の関数とコマンドおよびシステム変数を使って記述する. +コマンドは以下からなる. +\begin{itemize} +\item 宣言と変数,関数定義のための5つのコマンド({\tt ENTRY, FUNCTION, INTEGERS, +MACRO, STRINGS}) + +\begin{table}[h] +\begintable +{\dg コマンド名}\ | {\dg 機\hskip2cm 能}\hfil\crthick +{\tt ENTRY}\hfill | フィールドとエントリを宣言する\hfill\cr +{\tt FUNCTION}\hfill | 新たな関数を定義する\hfill\cr +{\tt INTEGERS}\hfill | グローバルな整数型の変数を宣言する\hfill\cr +{\tt MACROS}\hfill | 文字列マクロを定義する\hfill\cr +{\tt STRINGS}\hfill | グローバルな文字列型の変数を宣言する\hfill\endtable +\end{table} + +\item データベース読み込みのためのコマンド({\tt READ}).データベース +を読み込み,内部的にリストの形式にする. +\newpage +\item 処理と出力のための4つのコマンド({\tt EXECUTE, ITERATE, REVERSE, SORT}) + +\begin{table}[h] +\begintable +{\dg コマンド名}\ | {\dg 機\hskip2cm 能}\hfil\crthick +{\tt EXECUTE}\hfill | 1つの関数を実行する\hfill\cr +{\tt ITERATE}\hfill | 現在のリスト中の各エントリに対して1つの関数を +適用する\hfill\cr +{\tt REVERSE}\hfill | {\tt ITERATE}と同じ操作をリストの逆順に行う\hfill\cr +{\tt SORT}\hfill | {\tt sort.key\$}によってリストをソートする\hfill\endtable +\end{table} +\end{itemize} + +システム変数には以下がある. +\begin{table}[h] +\begintable +{\dg 変数名}| {\dg 説\hskip2cm 明}\hfil\crthick +{\tt sort.key\$}\hfill | 文字列型,ソートのキー\hfill\cr +{\tt entry.max\$}\hfill | 整数型,エントリ文字列の最大長(100)\hfill\cr +{\tt global.max\$\ }\hfill | 整数型,文字列の最大長(1000)\hfill\endtable +\end{table} + +以下にスタイルファイル{\tt alpha}の一部分を例として示す. + +\begin{figure}[h] +{\baselineskip=11pt +\begin{quote} +\begin{verbatim} +MACRO {tcs} {"Theoretical Computer Science"} +READ +FUNCTION {sortify} + { purify$ "l" change.case$ } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +INTEGERS { et.al.char.used } +FUNCTION {initialize.et.al.char.used} + { #0 'et.al.char.used := } +EXECUTE {initialize.et.al.char.used} +ITERATE {presort} +SORT +EXECUTE {initialize.longest.label} +ITERATE {forward.pass} +REVERSE {reverse.pass} +FUNCTION {begin.bib} +{ et.al.char.used + { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ } + 'skip$ + if$ + preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +\end{verbatim} +\end{quote} +} +\end{figure} +\section{日本語化の概要} +\subsection{バージョン0.10と0.20の生い立ち} +最小限の変更ですませることにし\myftnote{手抜きである.}, +以下の形で元の\BibTeX (Version 0.99c; Pascal版)に変更を +加えた第1バージョン(0.10)を1988年5月に作成した.この +ために行った変更は,change +fileの変更が600行程度,Cで書かれたサポートルーチン(bibext.c)への +変更が50行程度であるが,change fileへの本質的な変更は200行程度である. + +その後1989年5月に\BibTeX のCバージョンに対応して, +Pascalコンパイラーのないシステムでも動作するように, +第2バージョン(0.20)を作成した.このために +行った変更は,新たな組み込み関数を追加する +ことも含めてchange fileの変更が450行程度, +bibext.cへの変更が430行程度で +ある\myftnote{{\tt web2c}の出力中の{\tt putc}を日本語 +コードに対応するための{\tt Fputc}に{\tt sed}する +ために{\tt Makefile}の一部分も変更した.}.{\tt bibext.c}の変更の +大部分は\JTeX 用に桜井氏が作成したプログラムを流用しているので,新たに +作成した部分は少ない\myftnote{作業はSUN-3で行ったが,その他のマシンへの +移植作業はJUNETを通じて協力していただいた.これにより +現在は,SUN-4, VAX/ Ultrix/BSD, NEWS /NEWS-OS, Symmetry /Dynix, +FACOM M Series /UTS, LUNA /BSD, ΣWSなどで動作している.}. + +\subsection{バージョン0.30とMS-DOS版の旅立ち} +筆者が勤務の関係で米国出張中のクリスマス休暇の間に作成した +のがバージョン0.30と{\tt MS-DOS}版の\JBibTeX である\myftnote{寒い所 +だったので,家族で外出 +する気にもならず,お金もなかったので旅行もできずで {\tt :-)}.}. + +バージョン0.30ではASCII版のversion 0.98をベースにした{\tt Kanji BibTeX} +との整合性を向上させる,また不完全であった日本語対応を完全にするなどの +作業を行った. +このためにバージョン0.20から変更したchange fileの行数は50行程度である. +これに際しては,職場の同僚である +二方厚志,所健一の両氏,(株)アスキーの倉沢良一,渡邉雄一両氏の協力を得た. +特に渡邉氏には多忙な中,様々なテストに協力していただいた. +バージョン0.30ではドキュメント類の修正,スタイルファイルの改良も行った. +これにより,NTT版だけでなく,ASCII版でも(ドキュメントの処理も含めて) +問題なく動作するバージョンの配布キットが完成した. + +MS-DOS版はUNIX上で作成したCのソースを直接変更してTurbo-Cを利用して作成した. +コンパイラ,リンカの制約から大量の大域変数が宣言できないので, +大域変数の宣言部分をいくつかのファイルに分けるとか,動的にメモリを +割り当てるとかの変更をCソースに直接施した.変更行数は100行程度である. +利用可能メモリの制約から,処理可能引用文献数がUNIX版に比べて +少ないことを除けば(300件程度以内でないとだめ), +実用上十分な性能を持つプログラムである. + +\subsection{漢字コードの扱い} + +オリジナルの\BibTeX への変更を少なくするために, +漢字コードは内部的にはEUCで表現することとした. +ファイルから一行を読み込む時点で,EUCならそのまま,JIS漢字コードはEUCに +コード変換する\myftnote{JIS漢字コードのエスケープ・シーケンスの +先頭の2バイトのみを漢字in/outの +判定に使用し,3バイト目は何でもよいようにしてある.また,当所ではSJISは +使っていないのでバージョン0.10ではそれは考えていなかったが, +バージョン0.20ではそれにも対処できるようにした.MS-DOS版ではSJISがディフォルト +の漢字コードになっている.JISも読める.}. + +漢字コードをファイルに書き出す時にコード系の変換を行う.\JBibTeX +はNTT版 \JTeX に改良を加えて漢字コードとしてJISの他に,EUCも使えるように +したものの上の\JLaTeX と対にして使うことを前提としているが,ASCII版でも +問題なく使える. +この\JTeX では漢字コードの指定がEUC/SJISであっても,JIS漢字コードも読み込める +ように変更したものである\myftnote{都立大の桜井氏が中心となって +開発しているバージョンに対応している.}. + +そこで第1バージョン(0.10)では漢字コードの変換は以下の形で行う +こととした. + +\begin{itemize} +\item 補助({\tt aux}),スタイル({\tt bst}),データベース({\tt bib})ファイル中 +の漢字コードの総てがEUC漢字コードであれば,{\tt bbl}, {\tt blg}ファイル +あるいは端末への出力はEUCコードで行う. +\item 上記以外の場合には,書き出しが行れる直近に読んだJIS漢字のコードの +エスケープ・シーケンスを使って漢字コードを書き出す\myftnote{完全に漢字コード +対応になっていない可能性があるので,bibファイルなどの記述にエラーがあった +時に,端末などにEUCコードのままで漢字コードが出力されるかもしれない(第1 +バージョン(0.10)の場合).}. +\end{itemize} + +漢字コードの変換は,入力時はbibext.cで行い,出力時はbibtex本体で行うことと +したために,change fileの変更が多くなった. + +第2バージョン(0.20)以降では,漢字コード系はサイト毎に +コンパイル時に決定することとし,利用者単位には次の環境変数で変更可能とした. + +\begin{figure}[h] +\thicksize=0pt +\thinsize=0pt +\begintable +端末\hfill |{\tt BIBTERMCODE}\hfill | \hskip5cm\cr +ファイル\hfill | {\tt BIBFILECODE}\hfill | \hskip5cm\endtable +\end{figure} + +これらの変数に\JTeX の\verb|\kanjiterminaltype|, +\verb|\kanjifiletype|で指定するのと同じ値を設定することで(EUCなら20, +SJISなら10など)入出力のコード系を変更できる(\JTeX 同様EUC, SJISを指定 +してあってもJISコード系も読み込めるようになっている). + +漢字コードの変換はすべてbibext.cの中で行うこととしたので,change fileの +変更が少なくなっている. + +\subsection{組込み関数の仕様変更} + +組込み関数の{\tt substring\$, text.prefix\$} においては +1つの漢字コードの間で(1バイト目と2バイト目の間で)文字列が切られないようにした. +例えば,`漢字' の先頭から3文字(バイト)を抜出すと `字' の2バイト目がなくなって +しまうので,このような場合には,4バイト目まで切出すようにした\myftnote{これは +日本語用のスタイルでない{\tt alpha, plain}などを +使った場合でもそれなりの出力が得られるようにするためである.}. + +前記との関係で,{\tt chr.to.int\$} は引数が +漢字コードならばsingle characterでなくてもwarningを出さず, +漢字文字列の1バイト目のコードを値として返すようにした\myftnote{これは0.10バー +ジョンで試作したスタイルファイル中で,漢字コード文字列の判定をいいかげんに +行うために必要となった変更であり,0.20バージョンでは漢字コード文字列判定用に +新たな組み込み関数を追加したので不要かも知れない.}. + +以上はバージョン0.10から行っていた変更であるが,バージョン0.30では,さらに +次の2つの変更も追加した. + +{\tt add.period\$} 関数は,半角の`!'$\!$, `?'$\!$, `.'で終われば, +`.'を付加しないので,全角の`!',`?',`.',`。'で終わっても +`.'を付加しないようにした. + +{\tt format.name\$} 関数では,漢字コードで表記された氏名の場合には全角の空白も +半角の空白と同じように扱うこととした.また複数の名前は \verb*| and | +を間に入れて列挙するが,漢字コード表記された氏名の場合には +全角の``,'', ``、''を使っても \verb*| and | と同じように扱うようにした. +これで漢字コード著者名の入力が以前より簡単になるはずである(少なくともPCでかな +漢字変換FEPを使っている場合には,半角への切り替えが不要になる). + +\subsection{組み込み関数の追加} + +次に述べる日本語用のスタイルに関連することであるが,漢字コードを含む文字列の +場合に処理を分ける必要がある.第1バージョンでは漢字コードを含むかどうかは, +先頭文字のみで判定するようなスタイルを作成したが,これでは不完全である +ので,第2バージョン以降からは{\tt is.kanji.str\$} という関数を追加した. +この関数は,与えられた文字列が日本語コード(non ASCIIコード)を +含む時に``真''(整数の1)を返す関数である. + +\newpage +\section{日本語用のスタイル} + +\subsection{問題点} +前述の方法で日本語を扱えるようにしても,\BibTeX のスタイル(bst)を +日本語に合せないと,参考文献が奇妙な型式となる. +例えば,{\tt plain}のスタイルを使うと,著者が複数の場合 + +\vskip 2mm +\hskip1cm +[1] 松井 and 篠原 $\cdots$ +\vskip 2mm + +\noindent のような形になってしまう.日本語の場合にはやはり + +\vskip 2mm +\hskip1cm +[1] 松井, 篠原 $\cdots$ +\vskip 2mm + +\noindent のようになって欲しい.また英語の場合には`{\tt et al.}'でよいが +日本語の場合には`{\dg ほか}'の方がよい. +さらに,文献をソートする場合には著者名を主キーとするスタイルが多いので, +ここが漢字コードであると漢字コードの順に並ぶので具合がよくない. + +{\tt alpha}では著者の名前からラベルを作るが,英語と混在することを考えると +ラベルも + +\vskip 2mm +\hskip1cm +[松篠87] 松井, 篠原 $\cdots$ +\vskip 2mm + +\noindent のような形よりは + +\vskip 2mm +\hskip1cm +[MS87] 松井, 篠原 $\cdots$ +\vskip 2mm + +\noindent のほうが望ましいと考えた. + +\subsection{日本語用のスタイルの試作} + +上記のような問題を解決することを考慮したスタイルを標準スタイル +{\tt plain}, {\tt alpha}, {\tt abbrv}, {\tt unsrt}を基に{\tt jplain}, +{\tt jalpha}, {\tt jabbrv}, {\tt junsrt} +という形で作ってみた.また情報処理学会論文誌{\tt tipsj},情報処理学会 +欧文論文誌{\tt jipsj}, +電子情報通信学会論文誌{\tt tieic},日本オペレーションズリサーチ学会 +論文誌{\tt jorsj},人工知能学会誌{\tt jsai}, +ソフトウェア科学会誌{\tt jssst}用の +スタイルも試作してみた. + +参考文献のソートあるいはラベル作成を巧く行うことを +考え合せて,日本語の文献には著者名のローマ字標記を`名前', `姓'の順で(英語風に) +入れる`{\tt yomi}'なる新たなフィールドを{\tt bib}ファイル中に +書くこととした\myftnote{この順番に異論のある人もあろうが\cite{jeng}, +多くの日本人がこの形で(英語で)書いて論文を発表していることから +こう決めた.}$^,$\myftnote{ここにひらがなで`読み'をかくことも, +もちろんできるから,五十音順にソートすることも可能である.}. +このフィールドを使ってソートを行ったり, ラベルを作るような形で +上記のスタイルを作成した\myftnote{yomiというフィールドを +加えるために{\tt bibtex}本体を変更する必要はない. +スタイルファイル中の{\tt ENTRY}に追加するだけである.}$^,$\myftnote{著者名の +処理以外にも変更を加えている.詳しくは配布キット中の{\tt jbtxbst.doc}を +参照されたい.}. + +\newpage +{\tt jalpha}スタイルの一部を例として示す(ただし配布済みのスタイルとは +異なる部分がある). + +\vskip2mm + +{\baselineskip=11pt +\begin{quote} +\begin{verbatim} +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$ +} + +\end{verbatim} +\end{quote} +} + +\subsection{データベースの記述方法} + +以上のようにした\JBibTeX のための{\tt bib}ファイルの中身は次のように +する\myftnote{著者の姓と名の間にスペース(半角でも全角でも)を +入れておかないと,{\tt jabbrv}スタイルの時に姓だけにならずに,名も出 +力されてしまうので注意が必要である.スペースで姓と名を区切った場合には, +スタイルファイルの記述において,漢字コード著者名を{\tt format.name\$} して +得られるfirst nameには姓が,last nameには名が得られることに注意が必要で +ある({\tt format.name\$} を完全には日本語対応にしていないためである.しかし +family name, last tokenと読み替えれば問題ないし{\tt :-)}.日本語対応の +スタイルファイルを作成した経験から言うと,漢字コード著者名と +それ以外の場合に同じフォーマットを指定して{\tt format.name\$} を呼び出す +ことはほとんどないので,混乱するかもしれないが,あえてこのままにしてある). +また,例では漢字コード著者名の区切りとして,`` and '' を使ってあるが,ここは +もちろん,``,'' (但し全角!)でよい.}. + +{\baselineskip=11pt +\begin{quote} +\begin{verbatim} + @ARTICLE{la, + author="Masao Iri and Kazuo Murota and Shouichi Matsui", + title="Linear-time approximation algorithms for finding the + minimum-weight perfect matching on a plane", + journal=ipl,volume=12,pages="206--209",year=1981 + } +\end{verbatim} +\newpage +\begin{verbatim} + @ARTICLE{あふれ無し, + author="松井 正一 and 伊理 正夫", + title="あふれのない浮動小数点表示方式", + journal="情報処理学会論文誌", volume=21, number=4, pages="306--313", + yomi="Shouichi Matsui and Masao Iri", + year=1980 + } +\end{verbatim} +\end{quote} +} + +このようにデータベースを作成しておくと{\tt jplain}ならば + +\vskip 1.5mm +\hskip1cm +[1] Masao Iri, Kazuo Murota, and Shouichi Matsui. +Linear-time approximation $\cdots$ + +\hskip1cm +[2] 松井正一, 伊理正夫. あふれのない浮動小数点表示方式. $\cdots$ +\vskip 1.5mm + +\noindent のような形で参考文献リストが得られる.{\tt jalpha}なら + +\vskip 1.5mm +\hskip1cm +[IMM81] Masao Iri, Kazuo Murota, and Shouichi Matsui. Linear-time approximation + $\cdots$ + +\hskip1cm +[MI80]~~~ 松井正一, 伊理正夫. あふれのない浮動小数点表示方式. $\cdots$ +\vskip 1.5mm + +\noindent となる.{\tt jabbrv}なら + +\vskip 1.5mm +\hskip1cm +[1] M. Iri, K. Murota, and S. Matsui. Linear-time approximation + $\cdots$ + +\hskip1cm +[2] 松井, 伊理. あふれのない浮動小数点表示方式. $\cdots$ +\vskip 1.5mm + +\noindent となる.著者が漢字コードなのに`{\tt yomi}'がない場合には,例えば, + +\vskip 1.5mm +\hskip1cm +[松井80] 松井正一, 伊理正夫. あふれのない浮動小数点表示方式. $\cdots$ +\vskip 1.5mm + +\noindent となるようにしてある(著者が複数でも先頭の著者のみからラベルを +作るようにしてある).ただし,ソートキーには漢字コード(EUCコード)が +使われるから,順番はおかしなものとなる. + + +\section{おわりに} + +本稿では日本語化した\BibTeX である\JBibTeX について述べた. +バージョン0.20まではとりあえず動くという形で作成してあったが, +バージョン0.30では十分実用に耐えるレベルに達したと考えている. +日本語用のスタイルについても同様である. +現在までのところ利用者がさほど多くないため,使用経験が乏しい. +今後は使用経験に基づき,日本語のために必要な組み込み関数の +変更・追加などの改良を加えていきたい.また各種の学会用のスタイルの +作成も必要であると考えている. +またOren Patashnik氏からの私信によれば,今年中(1991)にversion 1.0をリリースする +予定らしいので,それの日本語化も必要であろう. + +\bibliography{jbibtex} +\bibliographystyle{jplain} +\end{document} diff --git a/Master/texmf-dist/doc/ptex/pbibtex/jbtxbst.doc b/Master/texmf-dist/doc/ptex/pbibtex/jbtxbst.doc new file mode 100644 index 00000000000..f14f76093c8 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/jbtxbst.doc @@ -0,0 +1,3762 @@ +% JBibTeX `jplain' family + % version 0.30 for JBibTeX versions 0.30 or later, LaTeX version 2.09. + % Copyright (C) 1990, all rights reserved. + % + % This file is derived from btxbst.doc of BibTeX 0.99c + % + % Copying of this file is authorized only if either + % (1) you make absolutely no changes to your copy, including name, or + % (2) if you do make changes, you name it something other than + % jbtxbst.doc, jplain.bst, junsrt.bst, jalpha.bst, jabbrv.bst, + % tipsj.bst, jipsj.bst, tieice.bst, jname.bst, jorsj.bst + % + % This restriction helps ensure that all standard styles are identical. + % The file jbtxbst.doc has the documentation for this style. + % + % Please notify Shouichi MATSUI(matsui@denken.or.jp) of any bugs in + % these standard styles or in this documentation file. + % 松井 正一 (財) 電力中央研究所 情報研究所 情報科学部 + % Last update 1994-10-25 +% +% このファイル jbtxbst.doc は参考文献スタイルの理解を助けるため,cpp などを +% 使って,違うスタイルを作成する場合の雛型として使うための物である. +% Oren Patashnik 氏による,btxbst.doc を翻訳するとともに,日本語用に修正,追加 +% を加えたものである. +% +% 標準スタイルは以下のようにして生成した後, +% cpp -P -DJPLAIN jbtxbst.doc jplain.txt +% cpp -P -DJUNSRT jbtxbst.doc junsrt.txt +% cpp -P -DJALPHA jbtxbst.doc jalpha.txt +% cpp -P -DJABBRV jbtxbst.doc jabbrv.txt +% cpp -P -DTIPSJ jbtxbst.doc tipsj.txt +% cpp -P -DJIPSJ jbtxbst.doc jipsj.txt +% cpp -P -DTIEICE jbtxbst.doc tieic.txt +% cpp -P -DJORSJ jbtxbst.doc jorsj.txt +% cpp -P -DJNAME jbtxbst.doc jname.txt +% 不要なコメント行,空行を削除した後,ファイル名を変更すれば生成できる. +% (実際には後述の cpp.awk を使って gawk で生成した). +% +% ASCII 版の versinn 0.98 に基づく Kanji BibTeX で使われている jplain, jalpha, +% junsrt, jabbrv に近い形の bst ファイルを作るには, +% +% cpp -P -DJPLAIN -DASCII98 jbtxbst.doc jplain98.txt +% +% というように, -DASCII98 を追加する.完全に同じではないが,かなり近い形の +% 文献リストデータ(bbl)が得られるようなスタイルファイルを得ることができる. +% +% cpp を持っていないとか,(PC 用の)C コンパイラーの cpp によっては上記の様に +% 処理できない場合がある.Turbo C 2.0 の cpp は賢こ過ぎて,上記の目的 +% には使えない.また行頭に # がなくてもそれを cpp への指令だとみなす処理系でも +% うまくいかない場合がある. +% cpp でうまく処理できない場合に使える gawk 用のスクリプトを bst/cpp.awk という +% 形で用意してある.使い方については bst/generate.[bat|sh] を見よ! +% +% UNIX の cpp では処理できることを期待する.少なくとも SUN の cpp では +% 処理できた. +% +% 不幸にして cpp が使えないとか, gawk もないとかの場合には,以下の説明を +% 参考にして人間 cpp になって,editor を使って編集して作り出せばいい. +% (こんな不幸なことはないでしょうね?) +% +% cpp の出力は特定の行が削除される(あるいは空白行が付加される)ことを除けば +% 入力と同じである.以下のシークエンスは,# 文字が第1カラムにあるとして, +% #if VAR +% VAR が 0 でない時に含める行 +% #else +% VAR が 0 の時に含める行 +% #endif +% +% VAR の値に応じてどちらの行群が使われるか,含まれるようになるかを示す. +% #else 部分はなくてもよい.#else, #endif の後にはコメントを書く事ができる. +% 変数は +% #define VAR value +% で値を設定でき, #ifdef VAR で VAR が値を持っているか(定義されているか), +% #ifndef VAR で VAR が値を持っていないか(未定義か)を調べることができる. +% このファイル中で使っているもう1つの形式は #if !VAR であり,これは VAR の +% 値が 0 の時に後続の行群を含めるようにするものである. +% +% 規約: プリプロセッサのための変数としては,すべて大文字を使うことにすれば, +% どこにあるか見つけるのが簡単になる. +% +% 言い訳: cpp の機能をフルに使うように書けば,このファイルはもっと小さくできる. +% しかし,作業した環境ではちゃんと使える cpp がなかったので, +% オリジナルで使っていなかった機能は使っていない. +% +% cpp への(gawk への)コマンド行では,JPLAIN, JUNSRT, JALPHA, JABBRV, JIPSJ, +% TIPSJ, TIEICE, JNAME, JORSJ のいずれかを指定しておくこと(どれでもないと, +% JPLAIN をディフォールトとして使うようになっている.従って新しいスタイルを +% 作り出す場合には,このディフォルトを設定している部分を書き換えること). +% +% それぞれの論理変数は,それぞれのスタイルで,真(1)か偽(0)に設定しておくこと. +% 現在使っている変数とその意味は以下の通りである. +% +% LAB_ALPH: 文字列ラベルを生成(これが偽なら数字ラベルになる) +% SORTED: (数字ラベルでないなら)ラベル,著者などの情報を +% 使ってにソートする(偽ならソートされずに,出現順に並ぶ) +% NAME_FULL: 著者,編者の名前として bibliography file 中に書かれた +% 物をそのまま使う(偽なら姓以外はイニシャルだけになる. +% 漢字表記された著者の場合には,姓と名の間にスペースが +% あれば,姓だけになる) +% ATIT_LOWER: 本以外(論文など)のタイトルは先頭の文字,コロンの後の +% 最初の文字以外は小文字にする(偽なら database 中のまま) +% MONTH_FULL: 月の名前を省略形としない(偽なら省略形) +% JOUR_FULL: 論文誌,雑誌などを省略形としない(偽なら省略形,現在は +% その形式は ACM の出版物にある形式である) +%---------------------------------------------------------------------- +% 松井による追加分 +% IN_LOWER: In でなく in を使う. +% ONE_SENTENCE: 1文の形にする. +% ED_SHORT: Editor でなく Ed. +% FAMILY_FIRST: 英語表記著者の姓を先に,名を後にする. +% FIRST_FAMILY_FIRST: 英語表記著者の第一著者だけ姓を先にする. +% NO_COM_AND: 3名以上の著者の時 and の前に , を入れない. +% SMALL_CAP: 表題は small cap フォント. +% KANJI_FULL_NAME: 漢字著者名は名まで出す. +% ED_IN_PAR : 編集者名を括弧に入れる. +% NO_EM: 本,雑誌名とかに強調指定(イタリック)は使わない. +% YEAR_IN_PAR: 年を括弧で囲む. +% ZENKAKU_PUN: 日本語文献に対しては全角の",",".",":"を使う. +% ZENKAKU_COLON: 1文形式の時,日本語著者の後には全角のコロンを +% 付ける. +% JIPSJ_LIKE: JIPSJ のような短い Vol., pp. 参照形式 +% Vol.=V, No.=N, pp. C--D, year=Y, month=M を +% V, N(M Y), C--D のような順番で並べる. +% USE_FIRST_ONLY: 文字列ラベルには第1著者しか使わない. +% USE_KANJI_HOKA: ``ほか''でなく``他''を使う +% SHOW_BOOK_PAGES: BOOK のページ数も出力する. +%---------------------------------------------------------------------- +% +% ディフォールトのスタイルの指定(新しいスタイルを加える場合にはここを +% 変更する必要がある.変更しておかないと jplain になってしまう!) +% +#ifndef JUNSRT +# ifndef JALPHA +# ifndef JABBRV +# ifndef TIPSJ +# ifndef JIPSJ +# ifndef TIEICE +# ifndef JNAME +# ifndef JORSJ +# define JPLAIN 1 +# endif JORSJ +# endif JNAME +# endif TIEICE +# endif JIPSJ +# endif TIPSJ +# endif JABBRV +# endif JALPHA +#endif +% +% ASSCII98 が定義されていれば,ASCII 版の 0.98 に基づく Kanji BibTeX の +% スタイルファイルを使って得られる結果に近いものが得られるようにする. +% まったく同じになると期待してはいけない!!! +% +#ifdef ASCII98 +# define ZENKAKU_PUN 1 +# define ZENKAKU_COLON 1 +#else !ASCII98 +# define ZENKAKU_PUN 0 +#endif +% +#ifdef JPLAIN +% jplain スタイル (ソートされた数値ラベル) +# define LAB_ALPH 0 +# define SORTED 1 +# define NAME_FULL 1 +# define ATIT_LOWER 1 +# define MONTH_FULL 1 +# define JOUR_FULL 1 +%-------------------------------------- +# define IN_LOWER 0 +# define ONE_SENTENCE 0 +# define ED_SHORT 0 +# define FAMILY_FIRST 0 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 0 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 0 +# define ED_IN_PAR 0 +# define NO_EM 0 +# define YEAR_IN_PAR 0 +# define JIPSJ_LIKE 0 +# define USE_KANJI_HOKA 0 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif JPLAIN +% +#ifdef JUNSRT +% junsrt スタイル (ソートされない数値ラベル) +# define LAB_ALPH 0 +# define SORTED 0 +# define NAME_FULL 1 +# define ATIT_LOWER 1 +# define MONTH_FULL 1 +# define JOUR_FULL 1 +%-------------------------------------- +# define IN_LOWER 0 +# define ONE_SENTENCE 0 +# define ED_SHORT 0 +# define FAMILY_FIRST 0 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 0 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 0 +# define ED_IN_PAR 0 +# define NO_EM 0 +# define YEAR_IN_PAR 0 +# define JIPSJ_LIKE 0 +# define USE_KANJI_HOKA 0 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif JUNSRT +% +#ifdef JALPHA +% jalpha スタイル (ソートされた文字列ラベル) +# define LAB_ALPH 1 +# define SORTED 1 +# define NAME_FULL 1 +# define ATIT_LOWER 1 +# define MONTH_FULL 1 +# define JOUR_FULL 1 +%-------------------------------------- +# define USE_FIRST_ONLY 0 +# define IN_LOWER 0 +# define ONE_SENTENCE 0 +# define ED_SHORT 0 +# define FAMILY_FIRST 0 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 0 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 0 +# define ED_IN_PAR 0 +# define NO_EM 0 +# define YEAR_IN_PAR 0 +# define JIPSJ_LIKE 0 +# define USE_KANJI_HOKA 0 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif JALPHA +% +#ifdef JABBRV +% jabbrv スタイル (ソートされた数値ラベルで,省略形式) +# define LAB_ALPH 0 +# define SORTED 1 +# define NAME_FULL 0 +# define ATIT_LOWER 1 +# define MONTH_FULL 0 +# define JOUR_FULL 0 +%-------------------------------------- +# define IN_LOWER 0 +# define ONE_SENTENCE 0 +# define ED_SHORT 1 +# define FAMILY_FIRST 0 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 0 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 0 +# define ED_IN_PAR 0 +# define NO_EM 0 +# define YEAR_IN_PAR 0 +# define JIPSJ_LIKE 0 +# define USE_KANJI_HOKA 1 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif JABBRV +% +#ifdef TIPSJ +% tipsj スタイル (ソートされない数値ラベルで,省略形,1文形式) +% 情報処理学会論文誌,情報処理学会誌用 +# define LAB_ALPH 0 +# define SORTED 0 +# define NAME_FULL 0 +# define ATIT_LOWER 0 +# define MONTH_FULL 0 +# define JOUR_FULL 0 +%-------------------------------------- +# define IN_LOWER 1 +# define ONE_SENTENCE 1 +# define ED_SHORT 1 +# define FAMILY_FIRST 1 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 1 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 1 +# define ED_IN_PAR 0 +# define NO_EM 0 +# define YEAR_IN_PAR 1 +# define JIPSJ_LIKE 0 +# define ZENKAKU_COLON 1 +# define USE_KANJI_HOKA 1 +# define SHOW_BOOK_PAGES 1 +%-------------------------------------- +#endif TIPSJ +% +#ifdef JIPSJ +% jipsj スタイル (ソートされた数値ラベルで,省略形を使う,1文形式) +% Journal of Information Processing (情報処理学会) +# define LAB_ALPH 0 +# define SORTED 1 +# define NAME_FULL 0 +# define ATIT_LOWER 0 +# define MONTH_FULL 0 +# define JOUR_FULL 0 +%-------------------------------------- +# define IN_LOWER 1 +# define ONE_SENTENCE 1 +# define ED_SHORT 1 +# define FAMILY_FIRST 1 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 1 +# define SMALL_CAP 1 +# define KANJI_FULL_NAME 1 +# define ED_IN_PAR 1 +# define NO_EM 0 +# define YEAR_IN_PAR 1 +# define JIPSJ_LIKE 1 +# define ZENKAKU_COLON 0 +# define USE_KANJI_HOKA 1 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif JIPSJ +% +#ifdef TIEICE +% tieic スタイル (ソートされない数値ラベルで,省略形を使う,1文形式) +% 電子情報通信学会論文誌 +# define LAB_ALPH 0 +# define SORTED 0 +# define NAME_FULL 0 +# define ATIT_LOWER 1 +# define MONTH_FULL 0 +# define JOUR_FULL 0 +%-------------------------------------- +# define IN_LOWER 1 +# define ONE_SENTENCE 1 +# define ED_SHORT 1 +# define FAMILY_FIRST 0 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 1 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 0 +# define ED_IN_PAR 1 +# define NO_EM 1 +# define YEAR_IN_PAR 1 +# define JIPSJ_LIKE 0 +# define ZENKAKU_COLON 1 +# define USE_KANJI_HOKA 1 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif TIEICE +% +#ifdef JNAME +% jname スタイル (ソートされた文字列ラベルで,省略形を使う,1文形式) +% 文字列ラベルには第1著者の名前しか使わない. +# define LAB_ALPH 1 +# define SORTED 1 +# define NAME_FULL 0 +# define ATIT_LOWER 0 +# define MONTH_FULL 0 +# define JOUR_FULL 0 +%-------------------------------------- +# define USE_FIRST_ONLY 1 +# define IN_LOWER 1 +# define ONE_SENTENCE 1 +# define ED_SHORT 1 +# define FAMILY_FIRST 0 +# define FIRST_FAMILY_FIRST 1 +# define NO_COM_AND 0 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 0 +# define ED_IN_PAR 0 +# define NO_EM 0 +# define YEAR_IN_PAR 0 +# define JIPSJ_LIKE 0 +# define ZENKAKU_COLON 1 +# define USE_KANJI_HOKA 1 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif JNAME +% +#ifdef JORSJ +% jorsj スタイル (ソートされた数値ラベルで,省略形を使う,1文形式) +% Journal of the Operations Research Society of Japan +% 日本オペレーションズリサーチ学会論文誌(英文,和文のどちらでも良い!) +# define LAB_ALPH 0 +# define SORTED 1 +# define NAME_FULL 0 +# define ATIT_LOWER 0 +# define MONTH_FULL 0 +# define JOUR_FULL 0 +%-------------------------------------- +# define IN_LOWER 1 +# define ONE_SENTENCE 1 +# define ED_SHORT 1 +# define FAMILY_FIRST 1 +# define FIRST_FAMILY_FIRST 0 +# define NO_COM_AND 1 +# define SMALL_CAP 0 +# define KANJI_FULL_NAME 1 +# define ED_IN_PAR 0 +# define NO_EM 0 +# define YEAR_IN_PAR 0 +# define JIPSJ_LIKE 1 +# define ZENKAKU_COLON 1 +# define USE_KANJI_HOKA 1 +# define SHOW_BOOK_PAGES 0 +%-------------------------------------- +#endif JORSJ +% +% エントリのフォーマット形式: Mary-Claire van Leunen が +% "A Handbook for Scholars" で推奨している形式に近い.本の仲間の表題は +% イタリック体で(強調されて),それ以外の表題は(電子情報通信学会論文誌を +% 除いて,引用符なしで)文の形式で大文字,小文字が使われる. +% このファイルでは,1文の形式でフォーマットするスタイル以外では, +% 主たるブロックの間に \newblock(\newline や \newpage に似た名前)を +% 出力するので,\ducumentstyle の引数として `openbib' オプションを指定 +% することで,open 形式のリスト,すなわちブロック間で改行され,ブロック +% 内ではインデントされた形式のリストを得る事ができる. +% ディフォールトは closed 形式であり,ブロック毎に改行されたりしない. +% +% 文献リストの文字列ラベルの形式は以下の通り. +% [Knu73] 著者(編者,キー)が1人の時 +% [AHU83] 複数著者の時は姓の頭文字を並べたもの +% (Aho, Hopcroft, Ulman の場合には AHU となる) +% +% 文献リストの数値ラベルの形式は以下の通り. +% [number] +% +% 文字列ラベルの形式のソートは以下の通り(次の順で文献が並ぶ). +% 主キーがラベル,次が著者(編者などの場合もある), +% その次が年,最後が表題のアルファベット順で並べられる. +% +% 漢字著者名の場合には yomi フィールドにローマ字表記を入れて +% 置く事で,文字列ラベルのラベルになる.書き方を工夫すれば, +% 日本語のラベルとすることもでき,さらに50音順に並べることも +% できる.詳しくは jbtxdoc.tex を見よ. +% +% 数値ラベルの形式のソートは以下の通り(次の順で文献が並ぶ). +% 主キーが著者(編者などの場合もある),次が年,最後が表題の +% アルファベット順で並べられる. +% +% 漢字著者名の場合には yomi フィールドにローマ字表記を入れて +% 置く事で,アルファベット順になる.書き方を工夫すれば,50音 +% 順に並べることもできる.詳しくは jbtxdoc.tex を見よ. +% +% ソートされない場合の文献の順番: +% 本文中の引用順. +% +% History +% 12/16/84 (HWT) Original `plain' version, by Howard Trickey. +% 12/23/84 (LL) Some comments made by Leslie Lamport. +% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik. +% 2/17/85 (HWT) Template file and other standard styles made. +% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f. +% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i: +% fixed Theoretical Computer Science macro name; +% fixed the format.vol.num.pages function. +% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes: +% assignment operator (:=) arguments reversed; +% the preamble$ function outputs the database PREAMBLE; +% entry.max$ and global.max$ (built-in) variables replace +% entry.string.max and global.string.max functions; +% alphabetizing by year then title, not just title; +% many unnecessary ties removed; \it ==> \em; +% the `alpha' style uses a superscripted `+' instead of a +% `*' for unnamed names in constructing the label; +% the `abbrv' style now uses "Mar." and "Sept."; +% the functions calc.label and presort now look at just +% the fields they're supposed to; +% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles; +% INBOOK and INCOLLECTION take an optional type (e.g. +% type = "Section"), overriding the default "chapter"; +% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow +% either volume or number, not just volume; +% INCOLLECTION now allows an edition and series field; +% PROCEEDINGS and INPROCEEDINGS now use the address field +% to tell where a conference was held; +% INPROCEEDINGS and PROCEEDINGS now allow either volume +% or number, and also a series field; +% MASTERSTHESIS and PHDTHESIS accept types other than +% "Master's thesis" and "PhD thesis"; +% UNPUBLISHED now outputs, in one block, note then date; +% MANUAL now prints out the organization in +% the first block if the author field is empty; +% MISC can't be empty---it requires some optional field. +% +% 以上は英語版の btxbst.doc の変更履歴である. +% +% 1989-06-02 松井正一(Shouichi Matsui) +% C version 0.20 用に変更,3つのスタイルを追加 +% 1991-01-01 松井正一(Shouichi Matsui) +% C version 0.30 用に変更と微調整多数!新たなスタイルも +% 追加! +% +% エントリのフィールドの宣言 +% +% (April '84 edition の 231-232 ページに述べられている) Scribe と +% 同じようなものであるが,(J)BibTeX は名前の処理機能を持っているので, +% fullauthor あるいは editors フィールドはない. +% annote フィールドは注釈付きの文献リストスタイルを作る場合には使われるが, +% このファイルで定義しているスタイルでは使っていないので,コメントアウト +% されている.ここに示したフィールドの他に,組み込みの文献リスト内参照 +% (CROSSREF)フィールドもあるが,これについては後で説明する. + +ENTRY +% フィールド群: +% 以下の説明で”新たな文を開始する”のは1文形式でフォーマットしない, +% スタイルの場合にのみあてはまる. + { address +% 通常は出版社,機関の住所を入れる.読者の為になる場合にのみ入れること. +% 例えば,大きな出版社の場合には省略すべきである.しかし,PROCEEDINGS +% または INPROCEEDINGS の場合にはここには会議の開催地を書く.この2つの +% エントリの型では,出版者,機関の住所が必要なら,publisher か +% organization フィールドに含めること. +% annote +% 長い注釈(注釈付き文献リスト用,新たな文を開始する). + author +% (J)BibTeX 形式で書いた,著者の名前 + booktitle +% 参照されているのが本全体でない場合に,本の表題を入れる.本全部を +% 参照している場合には,これでなく title フィールドを使うこと. + chapter +% 章(あるいは節など)の番号. + edition +% 本の版,("Second" などの) 順序数でないといけない. + editor +% (J)BibTeX 形式で書いた,編者の名前.author フィールドもある場合には +% 著作が発表された本などの編者の名前を書く. + howpublished +% この奇妙な物がどうして出版されたか(新たな文を開始する). + institution +% テクニカルレポートのサポート機関名 + journal +% 論文誌,雑誌の名前(いくつかマクロが用意されている). + key +% アルファベット順に並べる時,ラベルを作る時,文献リスト内参照のキーとして +% 使われる(著者,編者がないときに必要である). + month +% 月(マクロが用意されている). + note +% 読者が参照文献を見つけるのに役立つ情報(新たな文を開始する). + number +% 論文誌,雑誌,テクニカルレポートの番号,あるいはシリーズ中の番号. + organization +% 会議のスポンサー(あるいはマニュアルの出版社)の機関名で,著者(編者)が +% ない場合で,この情報からではラベルが奇妙になる場合,あるいは文献リスト内% 参照する場合には,適当な簡潔な機関名を key フィールドに入れること. + pages +% ページ番号,ページ数,あるいはページ範囲(範囲は `--' を使って, +% 単純な範囲ではない場合には後ろに `+' を付けて示すこと). + publisher +% 出版社(主体)の名前. + school +% 学校(大学)の名前(学位論文用). + series +% 複数巻からなる本のシリーズ名,各々の本は各々の表題を持っているはず. + title +% 参照しているものの表題. + type +% テクニカルレポートの場合にディフォルトで使われる "Technical Report" +% の代わりの名称(例えば "Research Note"),あるいは学位論文の種類, +% あるいは本のパートの名前. + volume +% 論文誌などの巻数,あるいは複数巻の書物の巻数. + year +% 年は数字だけでないといけない(正規化した後では,4つの数字で終わらない +% といけない.新たな文を開始しない). +% 昭和53とかを使ってもかまわないが,jalpha などで生成されるラベルが変な +% ものになることがあるので注意すること. + yomi +% 著者,編集者名の「読み」をauthor, editorなどの書式で +% 英語風に書く.ひらがなで書けば以外では五十音順の +% ソートもできる.詳しくは jbtxdoc.tex を見よ. + } + +% 日本語の文献かどうかのフラグ + {is.kanji.entry} + +% 以下の文字型変数は引用ラベルを作成するために使われる.メモリが足りない +% 場合には,sort.label は on the fly に簡単に作成できる. + +#if LAB_ALPH +#if SORTED + { label extra.label sort.label } +#else !SORTED + +% 文字列ラベルを使う場合に,引用順に並べるのは良いとは思えないが, +% その場合には,ちょっと別のやり方でラベルを作らなくてはならない. + + { label } +#endif SORTED +#else !LAB_ALPH + { label } +#endif LAB_ALPH + +% それぞれのエントリの型に対応した関数は,先ず output.bibitem を呼んで +% \bibitem とその引数を .BBL ファイルに書き出す.次に様々なフィールドが +% フォーマットされ output か output.check によって書き出される.これらの +% 出力関数は空文字列が渡されていないことを確認しながら,区切り記号(カンマ, +% ピリオド,コロン,\newblock)を書き出す処理を行う.最後に fin.entry が +% 呼ばれ,文の終わりのピリオドを書きだして,処理が終了する. +% +% 参考文献はいくつかのブロックとしてフォーマットされる: +% open 形式では,ブロックは新しい行を開始し,ブロック中ではインデントされる. +% ブロック中には複数の文があってよい(とはいっても文法的にいう文ではなく, +% ピリオドで終わる単語列ではあるが).エントリ関数は最初のブロック以外の +% ブロックを出力する前には new.block を呼ばねばならない. +% また新しい文を開始する場合には new.sentence を呼ばねばならない. +% 出力ルーチンは,ピリオドが2つ続いたりしないように,2つの new.sentence +% の間には,空文字列でないものがあることを確認する必要がある. +% new.block についても同じである. +% +% 出力ルーチンはその引数を直ちに出力しない.そのかわりに通常は +% スタックに置き,(区切り記号として何が必要か分かった時点で)次の +% 出力ルーチンが出力する.従って出力ルーチンはスタック上のデータに +% 必要な区切り記号を付加して書き出す必要がある. +% +% どの区切り記号が必要かを判定するために,output.state を使う. +% その値は以下のいずれか. +% before.all \bibitem の直後 +% mid.sentence 文の途中,後続がある場合にはカンマが必要 +% after.sentence 文の直後.ピリオドが必要 +% after.block ブロック(文)の直後.ピリオドと\newblock が必要 +%------------------------------------------------------------------------ +% after.author 著者名の後(: を付けるのに使う) +%------------------------------------------------------------------------ +% +%***************************************************************************** +%注意: +% +% 以下のコメント中で述べられているアルゴリズムは,日本語用のスタイルファイル +% の作成のために,コードのみ変更した部分があるので,実際のコードと必ずしも +% 同じものではない. +% +%***************************************************************************** +% +% VAR: output.state : INTEGER -- 出力の状態変数 +% +% output.nonnull 関数は(渡された物が空文字列でないとして),引数をスタック +% に保存し,保存しておいた文字列に必要とされる適当な区切り記号を後ろに +% 付加して書き出す.テストの順番は頻度順になっている. +% +% 1文の形にする場合(ONE_SENTENCEが真の場合)には,以下と異なるアルゴリズムで +% ある.実際のコードを参照のこと! +% +% output.nonnull(s) == +% BEGIN +% s := argument on stack +% if output.state = mid.sentence then +% write$(pop() * ", ") +% -- "pop" は関数ではない.スタックトップのデータを使う. +% else +% if output.state = after.block then +% write$(add.period$(pop())) +% newline$ +% write$("\newblock ") +% else +% if output.state = before.all then +% write$(pop()) +% else -- output.state は after.sentence のはず +% write$(add.period$(pop()) * " ") +% fi +% fi +% output.state := mid.sentence +% fi +% push s on stack +% END +% +% output は 引数が空でないなら(引数は未定義フィールドかもしれないので, +% 必ずしも文字列ではない), output.nonnull を呼び出す. +% +% output(s) == +% BEGIN +% if not empty$(s) then output.nonnull(s) +% fi +% END +% +% output.check はほとんど output 関数と同じであるが,必要なフィールドが +% ないことをユーザーに警告する.(これはそのフィールドのない文献情報は +% 良いものではないことを知らせるため,またそのフィールドがなくても,出力される +% フォーマット形式がまあまあの物になるようにするためである). +% +% output.check(s,t) == +% BEGIN +% if empty$(s) then +% warning$("empty " * t * " in " * cite$) +% else output.nonnull(s) +% fi +% END +% +% output.bibitem 関数は現在のエントリに対する \bibitem を書き出し +% (ラベルは既にできていると仮定する),状態に応じた区切り記号を設定する. +% 出力の規約に従った文字列をスタックに残す. +% +% output.bibitem == +% BEGIN +% newline$ +% write$("\bibitem[") % 以下3行は文字列ラベル用 +% write$(label) % +% write$("]{") % +% write$("\bibitem{") % この行は数値ラベルの時 +% write$(cite$) +% write$("}") +% push "" on stack +% output.state := before.all +% END +% +% fin.entry 関数はスタックに残っている文字列にピリオドを付加し,エントリの +% 処理を終える.もし状態がまだ before.all であればこのエントリに対しては何も +% 出力されていないので,結果は変なものになるが,利用者はそれに気づく. +% 文献は引用されているのであるから,引用ラベルを作るために bibitem は +% 必要であるから,エントリを省略したりしない. +% +% fin.entry == +% BEGIN +% write$(add.period$(pop())) +% newline$ +% END +% +% new.block 関数は出力する新たなブロックの準備を行い, +% new.sentence は新たなセンテンスの準備を行う. +% +% new.block == +% BEGIN +% if output.state <> before.all then +% output.state := after.block +% fi +% END +% +% new.sentence == +% BEGIN +% if output.state <> after.block then +% if output.state <> before.all then +% output.state := after.sentence +% fi +% fi +% END +% +#if ONE_SENTENCE +INTEGERS { output.state before.all mid.sentence after.sentence after.block + after.author} +#else !ONE_SENTENCE +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +#endif ONE_SENTENCE + +% 以下の3つの関数は AND, OR, NOT のためのものである. + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +#if ONE_SENTENCE + #4 'after.author := +#endif ONE_SENTENCE +} + +% s, t は作業用の文字列変数 +STRINGS { s t } + +% 全角の",",".”を使う時のための関数 +% 参考文献はコンパクトに組みたいので,私はこれは好きではないが, +% ASCII 版の 0.98 ではこの機能があったので. + +#if ZENKAKU_PUN +FUNCTION {add.kanji.period} +{ + add.period$ duplicate$ + #-1 #1 substring$ "." = + {#-2 global.max$ substring$ "." *} + 'skip$ + if$ +} +#endif ZENKAKU_PUN + +% 全角のコロンを使う場合にはこの定義はここにないといけない. +#if ZENKAKU_COLON +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +#endif ZENKAKU_COLON + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = +#if ZENKAKU_PUN + { is.kanji.entry + { "," * write$ } + { ", " * write$ } + if$ + } +#else !ZENKAKU_PUN + { ", " * write$ } +#endif ZENKAKU_PUN + { output.state after.block = + { +#if ZENKAKU_PUN + is.kanji.entry + {add.kanji.period write$} + {add.period$ write$} + if$ +#else !ZENKAKU_PUN + add.period$ write$ +#endif ZENKAKU_PUN + newline$ + "\newblock " write$ + } +#if ONE_SENTENCE + { output.state after.author = +#ifdef JIPSJ + { " " * write$ +#else !JIPSJ + { author empty$ editor empty$ and organization empty$ and + {write$} +#if ZENKAKU_COLON + { author field.or.null is.kanji.str$ + editor field.or.null is.kanji.str$ or + organization field.or.null is.kanji.str$ or + {":" * write$} + {": " * write$} + if$ + } +#else !ZENKAKU_COLON + {": " * write$} +#endif ZENKAKU_COLON + if$ +#endif JIPSJ + mid.sentence 'output.state := + } + 'write$ + if$ + } +#else !ONE_SENTENCE + { output.state before.all = + 'write$ +#if ZENKAKU_PUN + { is.kanji.entry + { add.kanji.period write$ } + { add.period$ " " * write$ } + if$ + } +#else !ZENKAKU_PUN + { add.period$ " " * write$ } +#endif ZENKAKU_PUN + if$ + } +#endif ONE_SENTENCE + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {output.bibitem} +{ newline$ +#if LAB_ALPH + "\bibitem[" write$ + label write$ + "]{" write$ +#else !LAB_ALPH + "\bibitem{" write$ +#endif LAB_ALPH + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +% この関数はエントリの出力を終りにする + +FUNCTION {fin.entry} +{ +#if ZENKAKU_PUN + is.kanji.entry + {add.kanji.period} + {add.period$} + if$ +#else !ZENKAKU_PUN + add.period$ +#endif ZENKAKU_PUN + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = +#if ONE_SENTENCE + { after.author 'output.state := } + 'skip$ +#else !ONE_SENTENCE + 'skip$ + { after.block 'output.state := } +#endif ONE_SENTENCE + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +% 時として,ブロックが十分に長い場合にのみ新たなブロックを開始しないといけない. +% new.block.checka 関数はその引数が空でない場合に new.block を実行する. +% new.block.checkb 関数はその2つの引数がどちらも空にない場合に new.block を +% 実行する. + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +% new.sentence.check 関数群も同じようなもの + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +% エントリのデータ群をフォーマットするための関数群 +% これらの関数群では,カンマあるいはピリオド(ピリオドの後にピリオドが続いたり +% しないように add.period$ を使って)を付けられるように,文字列か空文字列 +% を出力することを規約とする. +% +% 役にたつ補助関数 field.or.null は引数が未定義フィールド(データベースから +% データを読んだ時に値の設定されていないフィールド)かどうか,あるいは +% 空白以外の文字を含まない文字列かどうかをチェックし,そうであれば空文字列 +% を値として返す. +% この関数の主たる目的は(それだけではないが)スタックトップに残っている +% 値が未定義フィールドでなく,文字列であることを保証するためことである. +% +% field.or.null(s) == +% BEGIN +% if empty$(s) then return "" +% else return s +% END +% +% もう1つの補助関数 emphasize は引数が空文字列でなければそれに強調指定を +% 付加した値を返す.空文字列なら空文字列を返す.イタリック補正は付加しない +% ので,区切り記号が続く場合にのみ使うこと. +% +% 漢字を含む文字列の時には強調指定を付加しない.また NO_EM が定義されていれば +% 強調指定を付加しない. +% +% emphasize(s) == +% BEGIN +% if empty$(s) then return "" +% else +% if is.kanji.str$(s) then return s +% #if NO_EM +% return s +% #else !NO_EM +% else return "{\em " * s * "}" +% #endif NO_EM +% +% format.names 関数は,基本的には((J)BibTeX の名前形式で書かれた)引数を,カンマ +% で区切りながら,また最後の名前の前には and を前に付けて(最後が others で +% あれば et~al. として and を付けずに;漢字著者名の場合には et~al. ではなくて, +% "ほか"あるいは"他" を使い,カンマで区切るだけで and は付けずに), +% "First Von Last, Junior" の形にフォーマットする.(名前のフォーマット形式 +% の指定によっては First は省略形とされることもある). +% 引数には最低1つの名前がなければならない. +% +% 以下のアルゴリズムは日本語に対応する,新しく導入したスイッチ(変数)に対応 +% する,ためにコード部分が大幅に書き換えられているので,コードとは必ずしも +% 一致していない.しかし基本的な処理の流れは変わっていない. +% +% VAR: nameptr, namesleft, numnames: INTEGER +% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack) +% +% format.names(s) == +% BEGIN +% nameptr := 1 +% numnames := num.names$(s) +% namesleft := numnames +% while namesleft > 0 +% do +% 名前をフォーマットする形式が大きく変更されている +% % for full names: +% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}") +% % for abbreviated first names: +% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}") +% +% if nameptr > 1 then +% if namesleft > 1 then nameresult := nameresult * ", " * t +% else if numnames > 2 +% then nameresult := nameresult * "," +% fi +% % この部分も大きく変更されている +% % 漢字著者なら and を付けない, et~al. でなく"ほか/他"とする. +% if t = "others" +% then nameresult := nameresult * " et~al." +% else nameresult := nameresult * " and " * t +% fi +% fi +% else nameresult := t +% fi +% nameptr := nameptr + 1 +% namesleft := namesleft - 1 +% od +% return nameresult +% END +% +% format.authors は author があれば format.names(author) の値を,なければ +% 空文字列を返す +% +% format.authors == +% BEGIN +% if empty$(author) then return "" +% else return format.names(author) +% fi +% END +% +% format.editors は format.authors と同じであるが, editor フィールドを +% 使い,また後ろに ed., eds. などを付ける. +% +% 編集者を括弧に入れるなどの処理が付加されている.またed., eds. などの +% 省略形を使うとか,漢字著者の場合には(編)にするとかの変更もなされている. +% +% format.editors == +% BEGIN +% if empty$(editor) then return "" +% else +% if num.names$(editor) > 1 then +% return format.names(editor) * ", editors" +% else +% return format.names(editor) * ", editor" +% fi +% fi +% END +% +% 他のフォーマット関数も同じようなものなので,コメントバージョンは示さない. +% +% この関数の中の `pop$' 未定義値を取り去り空文字列を返すために, +% `skip$' はコピーした(duplicate$した)値そのものを返すために使われている. + +% 全角のコロンを使わなければ,この定義はここにあればよい. +#if !ZENKAKU_COLON +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +#endif !ZENKAKU_COLON + +#if NO_EM +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +#else !NO_EM +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { duplicate$ is.kanji.str$ + 'skip$ + { "{\em " swap$ * "}" * } + if$ + } + if$ +} +#endif NO_EM + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := +% まだ名前が残っていれば + { namesleft #0 > } +% 先ず現在注目している順番の名前をフォーマットする. +#if NAME_FULL + { 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$ +#else !NAME_FULL + { s nameptr "{ff}{ll}" format.name$ is.kanji.str$ +#if KANJI_FULL_NAME + {s nameptr "{ff}{ll}" format.name$ 't :=} +#else !KANJI_FULL_NAME + {s nameptr "{ff}" format.name$ 't := + t empty$ + { s nameptr "{ll}" format.name$ 't := + t " には,姓と名の間に空白がないよ? in " * cite$ * warning$ + } + 'skip$ + if$ + } +#endif KANJI_FULL_NAME +#if FAMILY_FIRST + {s nameptr "{ll,~~}{vv~}{f.}{, jj}" format.name$ 't :=} +#else !FAMILY_FIRST +#if FIRST_FAMILY_FIRST + { nameptr #1 = + {s nameptr "{ll,~~}{vv~}{f.}{, jj}" format.name$ 't :=} + {s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=} + if$ + } +#else !FIRST_FAMILY_FIRST + {s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=} +#endif FIRST_ERV +#endif FAMILY_FIRST + if$ +#endif NAME_FULL +% 第2番目以降? + nameptr #1 > +% 第2番目以降 +% まだ2人以上残っている? + { namesleft #1 > +% まだ2人以上残っている +#if ZENKAKU_PUN + { is.kanji.entry + {"," * t * } + {", " * t * } + if$ + } +#else !ZENKAKU_PUN + {", " * t * } +#endif ZENKAKU_PUN +% もう最後の1人だ! +% 最後の名前が others かな? +#if FAMILY_FIRST + { t "others" = t "others,~" = or +#else !FAMILY_FIRST + { t "others" = +#endif FAMILY_FIRST +% そうだ! + { s is.kanji.str$ +#if USE_KANJI_HOKA + {"他" * } +#else !USE_KANJI_HOKA + {"ほか" * } +#endif USE_KANJI_HOKA +#if SMALL_CAP + {"{\rm, et~al.}" * } +#else !SMALL_CAP + {", et~al." * } +#endif SMALL_CAP + if$ + } +% others でないぞ! + { s is.kanji.str$ +#if ZENKAKU_PUN + {"," * t * } +#else !ZENKAKU_PUN + {", " * t * } +#endif ZENKAKU_PUN +% Small caps を使う場合でも and は roman でないといけない +#if SMALL_CAP +#if NO_COM_AND + {"{\rm\ and }" * t * } +#else !NO_COM_AND + { numnames #2 = + {"{\rm\ and }" * t * } + {",{\rm\ and }" * t * } + if$ + } +#endif NO_COM_AND +#else !SMALL_CAP +#if NO_COM_AND + {" and " * t * } +#else !NO_COM_AND + { numnames #2 = + {" and " * t * } + {", and " * t * } + if$ + } +#endif NO_COM_AND +#endif SMALL_CAP + if$ + } + if$ + } + if$ + } +% 最初の名前だ! + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } +% Small caps の場合には {\sc, } で囲む +#if SMALL_CAP + { "{\sc " author format.names * "}" * } +#else !SMALL_CAP + { author format.names } +#endif SMALL_CAP + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } +#if SMALL_CAP + { "{\sc " editor format.names * "}" * +#else !SMALL_CAP + { editor format.names +#endif SMALL_CAP + editor num.names$ #1 > + { editor is.kanji.str$ +#if ED_SHORT +% 電子情報通信学会論文誌では editor, editors の形式が違う! +#ifdef TIEICE + {"(編)" * } {" Eds." * } if$ +#else !TIEICE + {"(編)" * } {" eds." * } if$ +#endif TIEICE +#else !ED_SHORT + {"(編)" * } {", editors" * } if$ +#endif ED_SHORT + } + { editor is.kanji.str$ +#if ED_SHORT +#ifdef TIEICE + {"(編)" *} {" Ed." * } if$ +#else !TIEICE + {"(編)" *} {" ed." * } if$ +#endif !EIEIC +#else !ED_SHORT + {"(編)" *} {", editor" * } if$ +#endif ED_SHORT + } + if$ + } + if$ +} + +% 編集者を括弧でくくる場合 +#if ED_IN_PAR +FUNCTION {format.in.ed.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { editor is.kanji.str$ +% 電子情報通信学会論文誌では editor, editors の形式が違う! +#ifdef TIEICE + {"(編)" *} {"Eds.\ by " swap$ * } if$ +#else !TIEICE + {"(編)" *} {"eds." swap$ * } if$ +#endif TIEICE + } + { editor is.kanji.str$ +#ifdef TIEICE + {"(編)" *} {"Ed.\ by " swap$ *} if$ +#else !TIEICE + {"(編)" *} {"ed." swap$ *} if$ +#endif TIEICE + } + if$ + } + if$ +} + +#endif ED_IN_PAR + +% format.title 関数は本の仲間でないものの表題をフォーマットするのに使われる. +% 殆どのスタイルでは(最初の文字とコロンの後(スペースが続いているかも +% しれない)の最初の文字を除いて),変換されて欲しくない大文字は中括弧 +% `{', `{' で囲まれていると期待して,タイトルの大文字を小文字に変換する. +% いくつかのスタイルではこの変換は行わずに,データベース中のままとする. +% +% 電子情報通信学会のスタイルではタイトルを``''で囲む. + +FUNCTION {format.title} +% 1文形式の場合にはタイトルの出力状態を after.author にしてから,処理開始 +#if ONE_SENTENCE +{ after.author 'output.state := + title empty$ +#else !ONE_SENTENCE +{ title empty$ +#endif ONE_SENTENCE + { "" } +#if ATIT_LOWER +#ifdef TIEICE + { "``" title "t" change.case$ * "''" * } +#else !TIEICE + { title "t" change.case$ } +#endif TIEICE +#else !ATIT_LOWER + 'title +#endif ATIT_LOWER + if$ +} + +% ディフォルトで (J)BibTeX は大域変数 global.max$ の値を (J)BibTeX の定数である +% glob_str_size に設定する.同様に entry.max$ の値をエントリの文字列の最大長で +% ある ent_str_size に設定する. +% そんなことはないとは思うが,これを変更してもよい. +% +% n.dashify 関数は文字列中の `-' を `--' に変換する. +% +% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack) +% +% n.dashify(s) == +% BEGIN +% t := s +% pageresult := "" +% while (not empty$(t)) +% do +% if (first character of t = "-") +% then +% if (next character isn't) +% then +% pageresult := pageresult * "--" +% t := t with the "-" removed +% else +% while (first character of t = "-") +% do +% pageresult := pageresult * "-" +% t := t with the "-" removed +% od +% fi +% else +% pageresult := pageresult * the first character +% t := t with the first character removed +% fi +% od +% return pageresult +% END + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ is.kanji.str$ + { t #1 #2 substring$ * + t #3 global.max$ substring$ 't := + } + + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + if$ + } + while$ +} + +% format.data 関数は月と年をフォーマットするためのものであり,月だけあって, +% 年がない場合には警告メッセージを出し,どちらもなければ空文字列を返す. +% +% 文献を1文の形式とする場合には原則的には年月は括弧に入れる. +% また情報処理学会英文論文誌以外の1文形式では月は表示しない. + +FUNCTION {format.date} +#if ONE_SENTENCE +{ before.all 'output.state := + year empty$ + { "there's no year in " cite$ * warning$ + "" + } +% 情報処理学会英文論文誌では括弧の中に month year を並べる +#ifdef JIPSJ + { month empty$ + { " (" year * ")" *} + { " (" month * " " * year * ")" * } + if$ + } +#else !JIPSJ +#if YEAR_IN_PAR + { " (" year * ")" * } +#else !YEAR_IN_PAR +#if ZENKAKU_PUN + { is.kanji.entry + {"," year * } + {", " year * } + if$ + } +#else !ZENKAKU_PUN + {", " year * } +#endif ZENKAKU_PUN +#endif YEAR_IN_PAR +#endif JIPSJ + if$ +} +#else !ONE_SENTENCE +{ year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + month + } + if$ + } + { month empty$ + 'year + { month " " * year * } + if$ + } + if$ +} +#endif ONE_SENTENCE + +% format.btitle 関数は本の仲間のエントリの表題をフォーマットする.大文字 +% 小文字はそのままにしておき,強調指定を付ける(NO_EM が指定されていれば, +% \em は付加されないことになっている). +% +% 電子情報通信学会論文誌ではタイトルは二重引用符で囲む + +FUNCTION {format.btitle} +#if ONE_SENTENCE +{after.author 'output.state := +#ifdef TIEICE +"``" title * "''" * +#else !TIEICE +title emphasize +#endif TIEICE +} +#else !ONE_SENTENCE +{ title emphasize +} +#endif ONE_SENTENCE + +% いくつかの関数では2つの文字列を連結する時に,後ろの文字列が長いもので +% ない(3文字未満)の時にタイ(~)を間に入れて,それより長ければ,空白を +% 間に入れて,連結する必要がある.連結結果はスタックに置く. +% +% \bibliography ではピリオド `.' の後に余分な空白はつけ加えられないので, +% \sfcode`\.=1000 が指定されているので,省略形の後でも単なる空白でよい. +% +% tie.or.space.connect(str1,str2) == +% BEGIN +% if text.length$(str2) < 3 +% then return the concatenation of str1, "~", and str2 +% else return the concatenation of str1, " ", and str2 +% END + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +% either.or.check 関数はいずれか一方しか使えないフィールドが両方使われて +% いた場合に文句をいう. +% +% either.or.check(t,s) == +% BEGIN +% if not empty$(s) then --- オリジナルでは not が抜けていた(バグ) +% warning$(can't use both " * t * " fields in " * cite$) +% fi +% END + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +% format.bvolume 関数は volume, そしておそらくは複数巻からなるシリーズの +% シリーズ名をフォーマットするために使われる.volume と series のフィールドが +% 両方ある場合には,series はシリーズの表題である(参照している巻の表題は title +% に書かれている)と仮定し "of シリーズ表題" を付加する.この関数は文の途中で +% 呼ばれる. +% +% 日本語のスタイルでは,volume でなく, Vol. を使う.シリーズ名, Vol. の +% 形式とする. + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { volume is.kanji.str$ + { volume } + { is.kanji.entry + {"第" volume * "巻" *} + {"Vol." volume tie.or.space.connect} + if$ + } + if$ + series empty$ + 'skip$ + { series is.kanji.str$ + { volume empty$ + {series swap$ * } +#if ZENKAKU_PUN + {series "," * swap$ * } +#else !ZENKAKU_PUN + {series ", " * swap$ * } +#endif ZENKAKU_PUN + if$ + } + { " of " * series emphasize * } + if$ + } + if$ + "volume and number" number either.or.check + } + if$ +} + +% format.number.series 関数はシリーズ名, そしておそらくはシリーズ中での番号を +% フォーマットするために使われる.これは format.bvolume に似ているが, +% この関数では series は存在し,volume はあってはならない(volume があれば +% 空文字列を返す).number フィールドが空であれば,series をそのまま出力する +% (空かも知れない).series にはシリーズの表題が入っている(title フィールドに +% 参照しているものの表題が入っている)と仮定して,"in <series>" の形で出力する. +% この関数は文の先頭で使われるので, Number の最初は大文字である. +% +% 日本語のシリーズ表題なら,<series>, <number> の形になる. +% 日本語のスタイルでは number, Number でなく, No. を使うように変更した. + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { number is.kanji.str$ + { number } + {"No." number tie.or.space.connect} + if$ + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { series is.kanji.str$ +#if ZENKAKU_PUN + { series "," * swap$ * } +#else !ZENKAKU_PUN + { series ", " * swap$ * } +#endif ZENKAKU_PUN + { " in " * series * } + if$ + } + if$ + } + if$ + } + { "" } + if$ +} + +% format.edition 関数は edition があれば " edition " 文字列を付加する. +% これは文の先頭で使われないので,edition は小文字に変換する. +% 日本語の edition に対しては " edition" は付加しない. + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { edition is.kanji.str$ + { edition } + { is.kanji.entry + {"第" edition * "版" *} + { output.state mid.sentence = + { edition "l" change.case$ " edition" * } + { edition "t" change.case$ " edition" * } + if$ + } + if$ + } + if$ + } + if$ +} + +% format.pages 関数は本のページ範囲をフォーマットする(希に論文/記事のページ +% 範囲のフォーマットにも使われる). +% +% multi.page.check 関数は "page/p." か "pages/pp. " のどちらを使うのが適切か +% 判断するために page フィールドに "-", ",", "+" の文字が含まれているかどうか +% 調べる.日本語用のスタイルでは page/pages の代わりに p./pp. を使っている. +% +% 注意:ここで使っている global.max$ は文字列の残り全部という意味で使っている. +% +% VAR: multiresult: INTEGER (actually, a boolean) +% +% multi.page.check(s) == +% BEGIN +% t := s +% multiresult := false +% while ((not multiresult) and (not empty$(t))) +% do +% if (first character of t = "-" or "," or "+") +% then multiresult := true +% else t := t with the first character removed +% fi +% od +% return multiresult +% END + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +% 日本語のスタイルでは原則として page/pages でなく p./pp. を使う. +% 情報処理学会英文論文誌では pp. は省略する. + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check +#if JIPSJ_LIKE + { " " pages n.dashify * } + { " " pages * } +#else !JIPSJ_LIKE + { "pp." pages n.dashify tie.or.space.connect } + { "p." pages tie.or.space.connect } +#endif JIPSJ_LIKE + if$ + } + if$ +} + +% format.vol.num.pages 関数は論文誌,雑誌の論文,記事の volume, number, +% ページ範囲をフォーマットする.その形式はスタイルで異なるので,コードを +% 参照のこと. +% +% 情報処理学会英文論文誌では volume, number (year), pages の形で並べる +% また volume は Vol.を付けずに bold でタイプセットする. No. も付けない. +% 電子情報通信学会論文誌では volume は Vol.を付けずに bold でタイプセットし, +% No. も付けない. +% 日本オペレーションズリサーチ学会論文誌では,情報処理学会英文論文誌と +% 同じような形であるが,volume を bold でタイプセットせずに, Vol. を使う. + +#ifdef JABBRV + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + number empty$ + 'skip$ + { "(" number * ")" * * + volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ":" * pages n.dashify * } + if$ + } + if$ +} + +#else !JABBRV + +#if JIPSJ_LIKE +FUNCTION {format.vol.num.year.pages} +{ volume empty$ + {""} +#ifdef JORSJ + { volume is.kanji.str$ + { volume } + {"Vol." volume tie.or.space.connect } + if$ + } +#else !JORSJ + {", {\bf " volume * "}" * } +#endif JORSJ + if$ +#ifndef JORSJ + number empty$ + 'skip$ + {", " number * * } + if$ +#endif + year empty$ + { "there's no year in " cite$ * warning$ } +% +% JORSJ では book の仲間は年を括弧に入れないので,論文などはここで年に +% 括弧を付ける +% +#ifdef JORSJ + { " (" year * ")" * *} +#else !JORSJ + { format.date * } +#endif JORSJ + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ", " * pages n.dashify * } + if$ + } + if$ +} + +#else !JIPSJ_LIKE +% +FUNCTION {format.vol.num.pages} +{ volume empty$ + {""} +#ifdef TIEICE + {"{\bf " volume * "}, " * } +#else !TIEICE +#if ZENKAKU_PUN + { volume is.kanji.str$ + { is.kanji.entry + {volume "," * } + {volume ", " * } + if$ + } + { is.kanji.entry + {"Vol." volume tie.or.space.connect "," * } + {"Vol." volume tie.or.space.connect ", " * } + if$ + } + } +#else !ZENKAKU_PUN + { volume is.kanji.str$ + {volume ", " * } + {"Vol." volume tie.or.space.connect ", " * } + if$ + } +#endif ZENKAKU_PUN +#endif TIEICE + if$ + number empty$ + 'skip$ +#ifdef TIEICE + { number * +#else !TIEICE + { number is.kanji.str$ + {number *} + {"No." number tie.or.space.connect *} + if$ +#endif TIEICE + volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { number empty$ +#if ZENKAKU_PUN + { format.pages * } + { is.kanji.entry + { "," * format.pages * } + { ", " * format.pages * } + if$ + } +#else !ZENKAKU_PUN + { format.pages * } + { ", " * format.pages * } +#endif ZENKAKU_PUN + if$ + } + if$ + } + if$ +} +#endif JIPSJ_LIKE + +#endif JABBRV + +% format.chapter.pages 関数は chapter が空でなければ,その前に type フィールド +% の文字列(それが空なら "chapter"を)付加する.pages があればそれを後ろに +% 加える.新たな文を開始したりしない. +% +% chapter が日本語文字列の場合には "chapter" は付加しない. + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { chapter is.kanji.str$ + { "" } + { is.kanji.entry + {"章"} + {"chapter"} + if$ + } + if$ + } + { type "l" change.case$ } + if$ + chapter is.kanji.str$ not is.kanji.entry and + {"第" chapter * swap$ *} + { chapter is.kanji.str$ + {chapter *} + {chapter tie.or.space.connect} + if$ + } + if$ + pages empty$ + 'skip$ +#if ZENKAKU_PUN + { is.kanji.entry + { "," * format.pages * } + { ", " * format.pages * } + if$ + } +#else !ZENKAKU_PUN + { ", " * format.pages * } +#endif ZENKAKU_PUN + if$ + } + if$ +} + +% format.in.ed.booktitle 関数は,editor フィールドがあればそれを表題の前に +% 置いて,"In <booktitle>" の形で始まる文を開始するために使われる. +% +% 情報処理学会英文論文誌,電子情報通信学会論文誌などでは ED_IN_PAR を 1 に +% しておくことで,編集者名は括弧に入れる +% 本のタイトルが日本語なら In は付けない。1文形式でフォーマットする場合などに +% In... でなく in ... の形式とするには,IN_LOWER を 1 にしておく. + +#if ED_IN_PAR +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { booktitle } + { booktitle " (" * format.in.ed.editors * ")" * } + if$ + } + if$ +} +#else !ED_IN_PAR +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { booktitle is.kanji.str$ + { " " booktitle emphasize * } +#if IN_LOWER + { "in " booktitle emphasize * } +#else !IN_LOWER + { "In " booktitle emphasize * } +#endif IN_LOWER + if$ + } + { booktitle is.kanji.str$ +#if ZENKAKU_PUN + { " " format.editors * "," * booktitle * } +#else !ZENKAKU_PUN + { " " format.editors * ", " * booktitle * } +#endif ZENKAKU_PUN +#if IN_LOWER + { "in " format.editors * ", " * booktitle emphasize * } +#else !IN_LOWER + { "In " format.editors * ", " * booktitle emphasize * } +#endif IN_LOWER + if$ + } + if$ + } + if$ +} +#endif ED_IN_PAR + +% empty.misc.check 関数はソートされる時,文字列ラベル使う時に key フィールドが +% 空でないのに,6つのフィールドが全部空なら文句をいう.ソートされない, +% 数値ラベルの時には6つのフィールドが全部空なら文句をいう. + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and +#if SORTED + key empty$ not and +#else !SORTED +#if LAB_ALPH + key empty$ not and +#endif LAB_ALPH +#endif SORTED + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +% format.thesis.type 関数は type フィールドが空でなければ(大文字,小文字変換 +% した) type フィールドの値を,そうでなければ既にスタックに積まれている +% ("Master's thesis" や "PhD thesis"などの)文字列を返す. + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +% format.tr.number 関数は type が空でなければその値で,空なら "Technical Report" +% で始まり,number があればそれが後に続く文字列を返す. number がなければ +% 先頭を大文字にした前述の文字列を返す.文の先頭で使われる. + +FUNCTION {format.tr.number} +{ type empty$ + { "Technical Report" } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +% さて文献リスト内参照用の関数の説明である.これらの関数は文献データベース +% 中のエントリで,他のエントリのデータベースキーが crossref フィールドに +% 書かれている時に,起動される.この機能によって論文集などの中の論文から +% 論文集などを参照することができる.このファイル中のスタイルでは以下の +% 5つのケースが想定されている. +% (1) ARTICLE が他の ARTICLE を参照している;(2) BOOK, (3) INBOOK, あるいは +% (4) INCOLLECTION が他の BOOK を参照している;(5) INPROCEEDINGS が PROCEEDINGS +% を参照している.それぞれについて後で詳しく説明する. +% +% ARTICLE エントリタイプは他の ARTICLE エントリを文献リスト内参照してもよい. +% これは論文誌/雑誌がある1つの話題の特集になっている時に,JOURNAL タイプなど +% というものはないから,これを著者,表題のない ARTICLE として扱わなければなら +% ないからである.この時にはその journal が参照文献リストに含まれている場合に, +% 警告メッセージが2つ出される.でも世の中なんてしょせんこんなものさ. +% +% "In" でなく "in にするとか,\em を付けないようにするとかできるように +% コードは変更されており,必ずしも以下のアルゴリズムと一致しない. +% +% format.article.crossref == +% BEGIN +% if empty$(key) then +% if empty$(journal) then +% warning$("need key or journal for " * cite$ * +% " to crossref " * crossref) +% return(" \cite{" * crossref * "}") +% else +% return("In " * emphazise.correct (journal) * +% " \cite{" * crossref * "}") +% fi +% else +% return("In " * key * " \cite{" * crossref * "}") +% fi +% END +% +% 他の文献リスト内参照用の関数も同じようなものなので,コメントバージョンはない. + +FUNCTION {format.article.crossref} +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { title is.kanji.str$ + { " " journal * } +#if IN_LOWER +#if NO_EM + { " " journal * } +#else !NO_EM + { "in {\em " journal * "\/}" * } +#endif NO_EM +#else !IN_LOWER + { "In {\em " journal * "\/}" * } +#endif IN_LOWER + if$ + } + if$ + } + { title is.kanji.str$ + { " " key * } +#if IN_LOWER + { "in " key * } +#else !IN_LOWER + { "In " key * } +#endif IN_LOWER + if$ + } + if$ + " \cite{" * crossref * "}" * +} + +% 文献リスト内参照されているものの編者名としては姓のみを,編者の人数に +% 応じて,"editor", "editor1 and editor2", "editor1 et~al." の形式で表現する. +% +% 電子情報通信学会論文誌では参照先の著者名もフルネームで出力する. + +FUNCTION {format.crossref.editor} +{ editor is.kanji.str$ +#ifdef TIEICE + {editor #1 "{ff}{ll}" format.name$ duplicate$ +#else !TIEICE + {editor #1 "{ff}" format.name$ duplicate$ +#endif TIEICE + empty$ + {pop$ editor #1 "{ll}" format.name$} + 'skip$ + if$ + } +#ifdef TIEICE + {editor #1 "{f. }{vv~}{ll}{ , jj}" format.name$} +#else !TIEICE + {editor #1 "{vv~}{ll}" format.name$} +#endif TIEICE + if$ + editor num.names$ duplicate$ + #2 > + { editor is.kanji.str$ +#if USE_KANJI_HOKA + {pop$ "他" *} {pop$ ", et~al." * } if$ +#else !USE_KANJI_HOKA + {pop$ "ほか" *} {pop$ ", et~al." * } if$ +#endif USE_KANJI_HOKA + } + { #2 < + 'skip$ +#ifdef TIEICE + { editor #2 "{f. }{vv }{ll}{, jj}" format.name$ "others" = +#else !TIEICE + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = +#endif TIEICE + { editor is.kanji.str$ +#if USE_KANJI_HOKA + {"他" *} {", et~al." * } if$ +#else !USE_KANJI_HOKA + {"ほか" *} {", et~al." * } if$ +#endif USE_KANJI_HOKA + } + { editor is.kanji.str$ + { +#if ZENKAKU_PUN + "," * +#else !ZENKAKU_PUN + ", " * +#endif ZENKAKU_PUN + editor #2 "{ff}" format.name$ duplicate$ + empty$ + {pop$ editor #2 "{ll}" format.name$} + 'skip$ + if$ + * + } + {" and " * editor #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ + } + if$ +} + +% BOOK (INBOOK) エントリ型では(複数巻からなるものの一部であるとして)他の +% BOOK(複数巻全部) を文献リスト内参照してもよい. +% 普通は editor があるから,その時は参照情報にそれを使う.なければ key +% フィールドが空でなければ key を,key が空なら(シリーズに複数巻の表題が入って +% いるはずだから) series フィールドを使う. + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + title is.kanji.str$ +#if IN_LOWER + {" "} {"in "} if$ +#else !IN_LOER + {" "} {"In "} if$ +#endif IN_LOWER + } + { volume is.kanji.str$ + { volume } + { is.kanji.entry + {"第" volume * "巻" *} + {"Vol." volume tie.or.space.connect " of " * } + if$ + } + if$ + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } +#if NO_EM + { series is.kanji.str$ +#if ZENKAKU_PUN + { series "," * swap$ * } +#else !ZENKAKU_PUN + { series ", " * swap$ * } +#endif ZENKAKU_PUN + { series * } + if$ + } +#else !NO_EM + { series is.kanji.str$ +#if ZENKAKU_PUN + { series "," * swap$ * } +#else !ZENKAKU_PUN + { series ", " * swap$ * } +#endif ZENKAKU_PUN + { "{\em " * series * "\/}" * } + if$ + } +#endif NO_EM + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} + +% INCOLLECTION エントリ型では BOOK (論文集であるとして) を文献リスト内参照して +% もよい,あるいは INPROCEEDINGS は PROCEEDING を文献リスト内参照してもよい. +% editor が普通はあるから,それを参照情報として使う.key フィールドが空でなけ +% れば key を,key が空なら(そこに参照しているものの表題が入っているはずだから) +% booktitle フィールドを使う. + +FUNCTION {format.incoll.inproc.crossref} +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { booktitle is.kanji.str$ + { booktitle } +#if IN_LOWER +#if JISPJ_LIKE + {"in " booktitle * } +#else !JIPSJ_LIKE +#if NO_EM + { booktitle } +#else !NO_EM + {"in {\em " booktitle * "\/}" * } +#endif NO_EM +#endif JIPSJ_LIKE +#else !IN_LOWER + {"In {\em " booktitle * "\/}" * } +#endif IN_LOWER + if$ + } + if$ + } +#if IN_LOWER + { "in " key * } +#else !IN_LOWER + { "In " key * } +#endif IN_LOWER + if$ + } + { title is.kanji.str$ + {" " format.crossref.editor * } +#if IN_LOWER + {"in " format.crossref.editor * } +#else !IN_LOWER + {"In " format.crossref.editor * } +#endif IN_LOWER + if$ + } + if$ + " \cite{" * crossref * "}" * +} + +% ここから .BIB ファイル中に書かれる可能性のあるエントリの型(ARTICLE とか +% BOOK とか)毎に,関数を定義する.これらの関数が .BBL ファイルに出力を行う. +% これらの関数の定義は READ コマンドより前になければならない.さらにスタイル +% 設計者としては,未定義の型用に default.type という関数も定義する必要がある. +% 注意: 以下で示されているフィールドの順番は(inbook, proceedingsで特に +% 断ってない限り),出力される順番に並んでいる. +% +% 学会誌の形式に合わせてコードが修正されているので,アルゴリズムとは必ずしも +% 一致しない. +% +% article 関数は ARTICLE 用であり,他の ARTICLE を文献リスト内参照してよい. +% 必須: author, title, journal, year +% 任意: volume, number, pages, month, note +% +% article == +% BEGIN +% output.bibitem +% output.check(format.authors,"author") +% new.block +% output.check(format.title,"title") +% new.block +% if missing$(crossref) then +% output.check(emphasize(journal),"journal") +% output(format.vol.num.pages) +% output.check(format.date,"year") +% else +% output.nonnull(format.article.crossref) +% output(format.pages) +% fi +% new.block +% output(note) +% fin.entry +% END +% +% book 関数は本全体の参照用.BOOK では他の BOOK を文献リスト内参照してよい. +% 必須: author or editor, title, publisher, year +% 任意: volume or number, series, address, edition, month, note +% SHOW_BOOK_PAGES が 1 なら,pages も任意フィールド +% +% book == +% BEGIN +% if empty$(author) then output.check(format.editors,"author and editor") +% else output.check(format.authors,"author") +% if missing$(crossref) then +% either.or.check("author and editor",editor) +% fi +% fi +% new.block +% output.check(format.btitle,"title") +% if missing$(crossref) then +% output(format.bvolume) +% new.block +% output(format.number.series) +% new.sentence +% output.check(publisher,"publisher") +% output(address) +% else +% new.block +% output.nonnull(format.book.crossref) +% fi +% output(format.edition) +% #if SHOW_BOOK_PAGES +% output(pages) +% #endif SHOW_BOOK_PAGES +% output.check(format.date,"year") +% new.block +% output(note) +% fin.entry +% END +% +% 他のエントリ関数も同じような物なので,コメントバージョンはない. +% 情報処理学会英文論文誌では volume, number, year, pages の順で出力する. + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { journal emphasize "journal" output.check +#if JIPSJ_LIKE + format.vol.num.year.pages output +#else !JIPSJ_LIKE + format.vol.num.pages output + format.date "year" output.check +#endif JIPSJ_LIKE +} + { format.article.crossref output.nonnull + format.pages output + } + if$ +#ifdef TIEICE + after.block 'output.state := +#endif !TIEICE + new.block + note output + fin.entry +} + +#if SHOW_BOOK_PAGES +FUNCTION {format.book.pages} +{ pages empty$ + { "" } + { pages " pp." *} + if$ +} +#endif SHOW_BOOK_PAGES + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + new.block + format.number.series output +#if ONE_SENTENCE + new.block +#else !ONE_SENTENCE + new.sentence +#endif ONE_SENTENCE + publisher "publisher" output.check + address output + } + { new.block + format.book.crossref output.nonnull + } + if$ + format.edition output +#if SHOW_BOOK_PAGES + format.book.pages output +#endif SHOW_BOOK_PAGES + format.date "year" output.check +#ifdef TIEICE + after.block 'output.state := +#endif !TIEICE + new.block + note output + fin.entry +} + +% booklet は製本されてはいるが,出版社,スポンサー機関名のないもの +% 必須: title +% 任意: author, howpublished, address, month, year, note + +FUNCTION {booklet} +{ output.bibitem + format.authors output + new.block + format.title "title" output.check + howpublished address new.block.checkb + howpublished output + address output + format.date output +#ifdef TIEICE + after.block 'output.state := +#endif !TIEICE + new.block + note output + fin.entry +} + +% conference タイプについては inproceedings を参照せよ. + +% inbook は本の1部(章,節 and/or ページ範囲)を参照するためのものであり, +% BOOK を文献リスト内参照していてもよい. volume フィールドがない場合には, +% type フィールドの情報が number や series よりも前に並べられる. +% 必須: author or editor, title, chapter and/or pages, publisher,year +% 任意: volume or number, series, type, address, edition, month, note + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output +#if !JIPSJ_LIKE + format.chapter.pages "chapter and pages" output.check +#endif !JIPSJ_LIKE + new.block + format.number.series output +#if ONE_SENTENCE + new.block +#else !ONE_SENTENCE + new.sentence +#endif ONE_SENTENCE + publisher "publisher" output.check + address output + } +#if JIPSJ_LIKE + { +#else !JIPSJ_LIKE + { format.chapter.pages "chapter and pages" output.check +#endif JIPSJ_LIKE + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check +#if JIPSJ_LIKE + format.chapter.pages "chapter and pages" output.check +#endif JIPSJ_LIKE +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry +} + +% INCOLLECTION は INBOOK と同じようなものではあるが,参照しているものが +% それ固有の表題を持つものである(たぶん全体の編者もある). +% INCOLLECTION は BOOK を文献リスト内参照してもよい. +% 必須: author, title, booktitle, publisher, year +% 任意: editor, volume or number, series, type, chapter, pages, +% address, edition, month, note + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.number.series output +#if !JIPSJ_LIKE +#ifndef TIEICE + format.chapter.pages output +#endif TIEICE +#endif !JIPSJ_LIKE +#if ONE_SENTENCE + new.block +#else !ONE_SENTENCE + new.sentence +#endif ONE_SENTENCE + publisher "publisher" output.check + address output + format.edition output +#ifdef TIEICE + format.chapter.pages output +#endif TIEICE + format.date "year" output.check +#if JIPSJ_LIKE + format.chapter.pages output +#endif JIPSJ_LIKE + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry +} + +% INPROCEEDINGS は会議の論文/予稿集に載っている論文で,論文/予稿集を文献リスト +% 内参照してもよい.address フィールドがなければ month (&year) が note の直前 +% 置かれる. +% 必須: author, title, booktitle, year +% 任意: editor, volume or number, series, pages, address, month, +% organization, publisher, note + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.number.series output +#if JIPSJ_LIKE + mid.sentence 'output.state := +#else !JIPSJ_LIKE +#ifndef TIEICE + format.pages output +#endif TIEICE +#endif JIPSJ_LIKE + +#if ONE_SENTENCE + new.block +#endif ONE_SENTENCE + address empty$ + { organization publisher new.sentence.checkb +#if ONE_SENTENCE + new.block +#endif ONE_SENTENCE + organization output +#if ONE_SENTENCE +#if JIPSJ_LIKE + new.block + mid.sentence 'output.state := +#else !JIPSJ_LIKE + mid.sentence 'output.state := + new.block +#endif JIPSJ_LIKE +#endif ONE_SENTENCE + publisher output +#ifdef TIEICE + format.pages output + format.date "year" output.check +#else !TIEICE + format.date "year" output.check +#endif TIEICE + } + { address output.nonnull +#ifndef TIEICE + format.date "year" output.check +#endif TIEICE +#if ONE_SENTENCE + new.block +#else !ONE_SENTENCE + new.sentence +#endif ONE_SENTENCE + organization output +#if ONE_SENTENCE + mid.sentence 'output.state := + new.block +#endif ONE_SENTENCE + publisher output +#ifdef TIEICE + format.pages output + format.date "year" output.check +#endif TIEICE + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry +} + +% conference 関数は Scribe との互換性のためにある. + +FUNCTION {conference} { inproceedings } + +% manual はマニュアル. +% 必須: title +% 任意: author, organization, address, edition, month, year, note + +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull + address output + } + if$ + } + { format.authors output.nonnull } + if$ + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { address new.block.checka + address output + } + 'skip$ + if$ + } + { organization address new.block.checkb + organization output + address output + } + if$ + format.edition output + format.date output +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry +} + +% mastersthesis は修士論文 +% 必須: author, title, school, year +% 任意: type, address, month, note + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + "Master's thesis" format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry +} + +% misc は他のどれにもあてはまらない物 +% 必須: 任意フィールドの少なくとも1つ +% 任意: author, title, howpublished, month, year, note + +FUNCTION {misc} +{ output.bibitem + format.authors output + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished output + format.date output +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry + empty.misc.check +} + +% phdthesis(博士論文) は mastersthesis のような物. +% 必須: author, title, school, year +% 任意: type, address, month, note + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle "title" output.check + new.block + "PhD thesis" format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry +} + +% proceedings は会議の論文/予稿集である. +% organization フィールドがあって, editor フィールドがない時には, +% organization フィールドが任意フィールドの最初のものとして使われる +% (最初のブロックを空にはしないようにする). +% address フィールドがなければ,month (& year) が note の直前に並ぶ. +% 必須: title, year +% 任意: editor, volume or number, series, address, month, +% organization, publisher, note + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization output } + { format.editors output.nonnull } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + format.number.series output + address empty$ + { editor empty$ + { publisher new.sentence.checka } + { organization publisher new.sentence.checkb + organization output + } + if$ + publisher output + format.date "year" output.check +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + } + { address output.nonnull + format.date "year" output.check +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE +#if ONE_SENTENCE + new.block +#else !ONE_SENTENCE + new.sentence +#endif ONE_SENTENCE + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + } + if$ + new.block + note output + fin.entry +} + +% techreport はテクニカルレポート +% 必須: author, title, institution, year +% 任意: type, number, address, month, note + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" output.check + address output + format.date "year" output.check +#ifdef TIEICE + after.block 'output.state := +#endif TIEICE + new.block + note output + fin.entry +} + +% unpublished は出版されていないもの. +% 必須: author, title, note +% 任意: month, year + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + note "note" output.check + format.date output + fin.entry +} + +% 分類不明のエントリに対しては `misc' を使う.(J)BibTeX は警告を出す. + +FUNCTION {default.type} { misc } + +% スタイルで異なるかも知れないが,一般的なマクロが以下に並んでいる. +% 利用者はこれらのマクロを使うのが望ましい. +% +% 月の名前はフルスペルか省略形で書く. + +#if MONTH_FULL + +MACRO {jan} {"January"} + +MACRO {feb} {"February"} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"August"} + +MACRO {sep} {"September"} + +MACRO {oct} {"October"} + +MACRO {nov} {"November"} + +MACRO {dec} {"December"} + +#else !MONTH_FULL + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sept."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +#endif MONTH_FULL + +% 論文誌名はフルスペルか省略形で表示する.省略形は ACM の出版物にある形. +% これとまったく違うセットの省略形を使う場合には,その定義のみからなる +% .bib ファイルを作るのが一番いいだろう.そうすれば利用者は \bibliography +% コマンドの1番目の引数としてそれを指定して,これらを取り込める. + +#if JOUR_FULL + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +MACRO {tieice} {"電子情報通信学会論文誌"} +MACRO {tipsj} {"情報処理学会論文誌"} +MACRO {jipsj} {"Journal of Informatin Processing Society of Japan"} +MACRO {jorsj} {"Journal of the Operations Research Society of Japan"} + +#else !JOUR_FULL + +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Softw. Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput.-Aided Design Integrated Circuits"} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Programming"} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Gr."} + +MACRO {toms} {"ACM Trans. Math. Softw."} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."} + +MACRO {tcs} {"Theoretical Comput. Sci."} + +MACRO {tieice} {"信学論"} +MACRO {tipsj} {"情報処理学会論文誌"} +MACRO {jipsj} {"J.~Info. Proc. Soc. of Japan"} +MACRO {jorsj} {"Journal of the O. R. Society of Japan"} + +#endif JOUR_FULL + +% .BBL ファイルのエントリを読み込む + +READ + +% 読み込まれた文献のデータが漢字のものかどうかチェックしてフラグを設定する. +% ASCII 版の 0.98 用のものを修正した. + +FUNCTION {set.is.kanji.entry} +{ + author field.or.null is.kanji.str$ + title field.or.null is.kanji.str$ or + editor field.or.null is.kanji.str$ or + journal field.or.null is.kanji.str$ or + booktitle field.or.null is.kanji.str$ or + series field.or.null is.kanji.str$ or + 'is.kanji.entry := +} + +ITERATE {set.is.kanji.entry} + +% sortify 関素は引数を purify$ した後に小文字に変換する.ソートのため, +% あるいはソート後にラベルを作る時に使われる. +% +% chop.word(w,len,s) は s そのものか,あるいは s の最初の len 文字が w と +% 等しければ(この比較は関数の定義の3行目で行われる w より後ろの s の +% 部分文字列を返す + +#if SORTED + +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +#else !SORTED +#if LAB_ALPH + +% ソートされない文字列ラベルつき文献リスト用の chop.word +% こんなの誰が使うの? + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +#endif LAB_ALPH +#endif SORTED + +% 以下の長いコメントは文字列ラベルの場合のみにあてはまる. +% +% format.lab.names 関数は名前の von と last パートの頭文字を使って短いラベル +% を作る(名前の数が4以上の場合には3つで切り,"+" を肩付きで加える.名前が +% 複数あり,最後が "others" である場合も同様に "+" を付ける). +% 名前が1つしかなく,von と last パートからなる名前トークンが1つしかないと, +% ("Knuth" は1つ,"Brinch Hansen"は2つ) 姓(last name)の頭3文字からラベルを +% 作る.et.al.char.used は必要に応じて LaTeX マクロを書き出すために,"+" が +% 使われたかどうかを保持する論理型の変数である. +% +% 漢字著者名の場合には yomi フィールドの情報を使って上と同様にラベルを作る. +% yomi フィールドがなければ,第一著者の姓のみからラベルを作る. +% +% format.lab.names(s) == +% BEGIN +% if not empty$(yomi) then s := yomi fi +% if is.kanji.str$(s) then return 第一著者の姓 fi +% else do +% numnames := num.names$(s) +% if numnames > 1 then +% if numnames > 4 then +% namesleft := 3 +% else +% namesleft := numnames +% nameptr := 1 +% nameresult := "" +% while namesleft > 0 +% do +% if (name_ptr = numnames) and +% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others" +% then nameresult := nameresult * "{\etalchar{+}}" +% et.al.char.used := true +% else nameresult := nameresult * +% format.name$(s, nameptr, "{v{}}{l{}}") +% nameptr := nameptr + 1 +% namesleft := namesleft - 1 +% od +% if numnames > 4 then +% nameresult := nameresult * "{\etalchar{+}}" +% et.al.char.used := true +% else +% t := format.name$(s, 1, "{v{}}{l{}}") +% if text.length$(t) < 2 then % there's just one name-token +% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3) +% else +% nameresult := t +% fi +% fi +% return nameresult +% od +% END +% +% ラベルの主要部分を作る時にどのフィールドに注目するかはエントリの型で異なる. +% これによって,どの型でも同じ情報を使う(例えば author, editor, key の順に使う) +% 場合に比べて,LaTeX book で述べられている「無視される」フィールドが本当に +% 「無視できる」ようになっている.MISC の判定は calc.label 関数中の if の +% 最後の else 部に置かれているから,データベース中の正しくないエントリ型でも +% ちゃんと処理できるようになっている. +% +% フィールドを見ていく順番は4つあるが,それぞれに対応した補助関数が用意されて +% いる.最初の関数は先ず author フィールドを調べ,必要な場合には key フィールド +% を調べる.他の3つの補助関数も同じようなものであるが,最初に2つのフィールド +% を調べ,その後に key フィールドを調べるようになっていたり,key フィールド +% を organization フィールドより先に調べるような形になっているのもある. +% (key が先なのはラベルに対しての話で,ソート用のラベルではないことに注意). +% +% calc.label 関数は以下のようにしてエントリの予備的なラベルを作る. +% (どのフィールドが空かによるが,また organization 中の "The"は無視するが) +% author あるいは editor あるいは organization から3文字取り出し(これらが +% 漢字の場合には,yomi フィールドが空でなければ yomi フィールドを author, +% editor, organization の代わりに使って3文字取り出し,空ならば2漢字取り出し) +% て作ったものの後ろに year の最後の2文字を付け加える.必要な author, editor, +% organization, key がなければエラーであるが,その場合には citt$ の最初の +% 3文字を使う. +% +% 得られるラベルの year 部分には purify$ が適用されているが, name 部分には +% purify$ は適用されていない.(year に対してpurify$ を適用するので,これを利用 +% して利用者はソート関数をだまして,順番を自分の都合の良いようにできる). +% +% これらの関数ではソートで使うラベルも作成する. +% +% 最終的なラベルには区別のために 'a', 'b' などを後ろにつける必要もあるが, +% この extra.label はソートした後で作る. +% +% calc.label == +% BEGIN +% if type$ = "book" or "inbook" then +% author.editor.key.label +% else if type$ = "proceedings" then +% editor.key.organization.label +% else if type$ = "manual" then +% author.key.organization.label +% else +% author.key.label +% fi fi fi +% label := label * substring$(purify$(field.or.null(year)), -1, 2) +% % assuming we will also sort, we calculate a sort.label +% sort.label := sortify(label), but use the last four, not two, digits +% END + +#if LAB_ALPH + +INTEGERS { et.al.char.used } + +FUNCTION {initialize.et.al.char.used} +{ #0 'et.al.char.used := +} + +EXECUTE {initialize.et.al.char.used} + +FUNCTION {format.lab.names} +{ 's := +% yomi フィールドが空でなければそれを使う + yomi empty$ + 'skip$ + { yomi 's :=} + if$ +#if USE_FIRST_ONLY +% +% 日本語文字列の場合には,第一著者の姓のみとする +% + s is.kanji.str$ + { s #1 "{ff}" format.name$ #4 text.prefix$ duplicate$ empty$ + { pop$ s #1 "{ll}" format.name$ #4 text.prefix$ + s #1 "{ll}" format.name$ " には,姓と名の間に空白がないよ? in " * + cite$ * warning$ + } + 'skip$ + if$ + } +% 日本語文字列でない場合の処理 + { s #1 "{ll}" format.name$ #3 text.prefix$ } + if$ +#else !USE_FIRST_ONLY +% +% 日本語文字列の場合には,第一著者の姓のみとする +% + s is.kanji.str$ + { s #1 "{ff}" format.name$ #4 text.prefix$ duplicate$ empty$ + {pop$ s #1 "{ll}" format.name$ #4 text.prefix$} + 'skip$ + if$ + } +% 日本語文字列でない場合の処理 + { + s num.names$ 'numnames := + numnames #1 > + { numnames #4 > + { #3 'namesleft := } + { numnames 'namesleft := } + if$ + #1 'nameptr := + "" + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { "{\etalchar{+}}" * + #1 'et.al.char.used := + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + numnames #4 > + { "{\etalchar{+}}" * + #1 'et.al.char.used := + } + 'skip$ + if$ + } + { s #1 "{v{}}{l{}}" format.name$ + duplicate$ text.length$ #2 < + { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } + 'skip$ + if$ + } + if$ + } + if$ +#endif USE_FIRST_ONLY +} + + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ +#if SORTED + { cite$ #1 #3 substring$ } +#else !SORTED % 後では警告を出さないからここで出しておく + { "for label, need author or key in " cite$ * warning$ + cite$ #1 #3 substring$ + } +#endif SORTED + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ +#if SORTED + { cite$ #1 #3 substring$ } +#else !SORTED % 後では警告を出さないからここで出しておく + { "for label, need author, editor, or key in " cite$ * warning$ + cite #1 #3 substring$ + } +#endif SORTED + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +{ author empty$ + { key empty$ + { organization empty$ +#if SORTED + { cite$ #1 #3 substring$ } +#else !SORTED % 後では警告を出さないからここで出しておく + { "for label, need author, key, or organization in " cite$ * + warning$ + cite #1 #3 substring$ + } +#endif SORTED + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +{ editor empty$ + { key empty$ + { organization empty$ +#if SORTED + { cite$ #1 #3 substring$ } +#else !SORTED % 後では警告を出さないからここで出しておく + { "for label, need editor, key, or organization in " cite$ * + warning$ + cite #1 #3 substring$ + } +#endif SORTED + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.label} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + duplicate$ + year field.or.null purify$ #-1 #2 substring$ + * + 'label := + year field.or.null purify$ #-1 #4 substring$ + * + sortify 'sort.label := +} + +% 文字列ラベルを使う場合に,引用順に並べるのは良いとは思えないが, +% その場合には,ちょっと別のやり方でラベルを作らなくてはならない. + +#if !SORTED + +ITERATE {calc.label} + +#endif !SORTED + +#endif LAB_ALPH + +% ソーティングでは presort を各々のエントリに対して実行することで sortkey +% を求める.presort キーには複数のブランクで区切られた sortify された +% いくつかの文字列が含まれる.これによって "brinch per" の方が +% "brinch hansen per" より前になる. +% +% ここで使われているフィールド群は以下の通り.文字列ラベルの場合には +% (calc.label で求めた) sort.label, 続いてエントリの型あるいは何が欠けているか +% で異なるが,著者名(編者,先頭の "The" を除いた機関名のこともある)または +% key フィールド,次が年,そして(先頭の "The ", "A ", or "An " を除いた) +% 表題の一部分である.. +% 名前は Von Last First Junior のようにフォーマットされる. +% 名前の断片は("brinch hansen")のように1つの空白で区切られ,名前の構成要素は +% (von と姓の部分を除いて)2つの空白で区切られ,複数の名前の間には3つの空白 +% が挿入され,名前と年(文字列ラベルの場合にはラベルと名前)の間には +% 4つの空白が挿入され,また年と表題の間にも4つの空白が挿入される. +% +% sort.format.names 関数は (J)BibTeX の名前形式で書かれた引数をとり, +% 上述の形式の " " で区切られた文字列を返す. format.namesとほとんど同じ. +% +% +#if SORTED + +FUNCTION {sort.format.names} +{ 's := +% +% yomi フィールドが空でなければそれを使う +% + yomi empty$ + 'skip$ + { yomi 's := } + if$ + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { ", " * } + 'skip$ + if$ +#if NAME_FULL + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := +#else !NAME_FULL + s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := +#endif NAME_FULL + nameptr numnames = t "others" = and + { s is.kanji.str$ +#if USE_KANJI_HOKA + {"他" * } +#else !USE_KANJI_HOKA + {"ほか" * } +#endif USE_KANJI_HOKA + {"et~al." *} + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +% sort.format.title は引数から先頭の "A ", "An ", "The " を取り除いた +% 文字列を返す. +% chop.word が変数 s を使っているので,別の文字列変数 t を使う. + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +% ここのソートの前処理用の補助関数群は,calc.label のものと同じような +% ものであるが,ここでは key フィールドより organization フィールドが優先 +% する.またソートのために organization フィールドの先頭の "The "は +% 取り除く. + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +% sort.key$ などのエントリの文字列変数の長さには entry.max$ の上限がある. +% そこで,生成するキーの長さをそれ以内とする.それだけの長さがあれば +% 1つしかマッチすることはないと仮定する. + +FUNCTION {presort} +#if LAB_ALPH +{ calc.label + sort.label + " " + * + type$ "book" = +#else !LAB_ALPH +{ type$ "book" = +#endif LAB_ALPH + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ +#if LAB_ALPH + * +#endif LAB_ALPH + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +% ソートの準備は整った. + +SORT + +#endif SORTED + +% この注釈はソートされた文字列ラベルを作る時のみあてはまる. +% +% 文字列ラベルの最終ステージであり,必要に応じて 'a', 'b' などを +% 付加する.2つのパスからなる. 'b', 'c' を付加するための前向きパスと, +% 'a' を付加するための後向きパスからなる.('b' がなければ'a'は付加する +% 必要はない) +% "thebibliography"環境のために width$ で計って最も長いラベルを求めておく. +% +% VAR: longest.label, last.sort.label, next.extra: string +% longest.label.width, last.extra.num: integer +% +% initialize.longest.label == +% BEGIN +% longest.label := "" +% last.sort.label := int.to.chr$(0) +% next.extra := "" +% longest.label.width := 0 +% last.extra.num := 0 +% END +% +% forward.pass == +% BEGIN +% if last.sort.label = sort.label then +% last.extra.num := last.extra.num + 1 +% extra.label := int.to.chr$(last.extra.num) +% else +% last.extra.num := chr.to.int$("a") +% extra.label := "" +% last.sort.label := sort.label +% fi +% END +% +% reverse.pass == +% BEGIN +% if next.extra = "b" then +% extra.label := "a" +% fi +% label := label * extra.label +% if width$(label) > longest.label.width then +% longest.label := label +% longest.label.width := width$(label) +% fi +% next.extra := extra.label +% END + +#if LAB_ALPH + +#if SORTED + +STRINGS { longest.label last.sort.label next.extra } + +INTEGERS { longest.label.width last.extra.num } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #0 int.to.chr$ 'last.sort.label := + "" 'next.extra := + #0 'longest.label.width := + #0 'last.extra.num := +} + +FUNCTION {forward.pass} +{ last.sort.label sort.label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + sort.label 'last.sort.label := + } + if$ +} + +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + label extra.label * 'label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ + extra.label 'next.extra := +} + +EXECUTE {initialize.longest.label} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +#else !SORTED + +% 文字列ラベルを使う時には「引用順」の参考文献リストとするのは +% あまり良くない.しかしその場合に備えて最も長いラベルを求めておく. + +STRINGS { longest.label } + +INTEGERS { longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +#endif SORTED + +#else !LAB_ALPH + + +% 数字ラベルを求める.ソートされた順番,あるいは元の順番で処理する. +% "thebibliography" environment で必要な情報である, +% width$ で計って最も長いラベルも同時に求めておく. + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +#endif LAB_ALPH + +% .BBL ファイルに書き出す準備が整った. +% 先ず文字列ラベルで省略された名前を示すのに使う LaTeX マクロを必要に +% 応じて書きだし,次にデータベース中の `preamble' コマンドの中身を書き出す. +% そして +% \begin{thebibliography}{...} +% を書き出す.ここで `...'は width$ で計算して最も長いラベルである. + +FUNCTION {begin.bib} +#if LAB_ALPH +{ et.al.char.used + { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ } + 'skip$ + if$ + preamble$ empty$ +#else !LAB_ALPH +{ preamble$ empty$ +#endif LAB_ALPH + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +% 全てのエントリを出力する. + +ITERATE {call.type$} + +% 最後に `\end{thebibliography}' コマンドを書き出しておしまい! + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} diff --git a/Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.bib b/Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.bib new file mode 100644 index 00000000000..3732dcc1c29 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.bib @@ -0,0 +1,116 @@ +Copyright (C) 1988, all rights reserved. +松井@電中研により,オリジナルのbtxdoc.bibから作成された. + +@COMMENT(You may put a comment in a `comment' command, + the way you would with SCRIBE.) + +Or you may dispense with the command and simply give the comment, +as long as it's not within an entry. + +If you really want to put a comment inside an entry, simply +make up a never-to-be-used field. + +@FAKE-ENTRY + {fake-database-key, + never-to-be-used-field = "Even if this were a real entry, + I could still have a comment inside an entry + by making up a fake field" + } + +@string (SCRIBE-NOTE = {Chapter twelve and appendices E8 through E10 deal + with bibliographies}) +@string (denken={電力中央研究所}) +The next entry shows some of the syntactically legal things that +those with the inclination may use.@ + +MaNuAl (scribe, + TITLE="Scribe Document Production System + + + User Manual", + ORGANIZATION = {Unilogic,}#" Ltd"# {. + }, + ADDRESS = "Pittsburgh", + MONTH +=aPR + ,YEAR=1984, + note = scribe-note, +) May the inclination not be with you. + + +@MANUAL{松井, + author = "松井 正一", + title = "日本語TeXの使い方日本語TeXの使い方日本語TeXの使い方日本語TeXの使い方日本語TeXの使い方日本語TeXの使い方日本語TeXの使い方日本語TeXの使い方日本語TeXの使い方", + address = denken, + yomi="Shouichi Matsui", + note = "JBibTeXのテスト", + year = 1987} + +@MISC{prime-number-theorem, + author = "Charles Louis Xavier Joseph de la Vall{\'e}e Poussin", + note = "A strong form of the prime number theorem, 19th century" } + +@INBOOK{chicago, + title = "The Chicago Manual of Style", + publisher = "University of Chicago Press", + edition = "Thirteenth", + year = 1982, + pages = "400--401", + key = "Chicago" } + +@BOOK{texbook, + author = "Donald E. Knuth", + title= "The {{\TeX}book}", + publisher = "Addison-Wesley", + year = 1984 , + note="(邦訳:『{\TeX} ブック』 斉藤 信男 監訳, + 鷺谷 好輝 訳, アスキー, 1989年)" +} + +@BOOK{latex, + author = "Leslie Lamport", + title = "{\LaTeX \rm:} {A} Document Preparation System", + publisher = "Addison-Wesley", + year = 1986, + note="(邦訳:『文書処理システム {\LaTeX}』 Edgar Cooke, 倉沢 良一 監訳, + 大野 俊治, 小暮 博道, 藤浦 はる美 訳, アスキー, 1990年)" + } + +@UNPUBLISHED{btxdoc, + author = "Oren Patashnik", + title = "{{\BibTeX ing}}", + note = "Documentation for general {\BibTeX} users", + month = jan, + year = 1988 } + +@UNPUBLISHED{btxhak, + author = "Oren Patashnik", + title = "Designing {\BibTeX} Styles", + note = "The part of \BibTeX's documentation + that's not meant for general users", + month = jan, + year = 1988 } + +@BOOK{strunk-and-white, + author = "Strunk, Jr., William and E. B. White", + title = "The Elements of Style", + publisher = "Macmillan", + edition = "Third", + year = 1979, + note = "(邦訳:『英語文章ルールブック』荒竹 三郎訳, 荒竹出版, 1985年)" +} + +@BOOK{van-leunen, + title = "A Handbook for Scholars", + author = "Mary-Claire van Leunen", + publisher = "Knopf", + year = 1979 } + +@UNPUBLISHED{jbibtex, + title="日本語{\BibTeX:\JBibTeX}", + author="松井 正一", + yomi="Shouichi Matsui", + year=1991, + note="\JBibTeX~C Versionキットと共に配布されている文書(ver.0.20用, 1989年)" } + + diff --git a/Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.tex b/Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.tex new file mode 100644 index 00000000000..a96dfce93fe --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/jbtxdoc.tex @@ -0,0 +1,1091 @@ +\documentstyle{j-article} +\postkinsoku `` +\parindent=\jspaceskip +\voffset=0cm +\hoffset=-0.2cm +\textwidth=16.2cm +\textheight=25cm +\jintercharskip=0pt plus 0.5pt minus 0.5pt + +\def\JTeX{\leavevmode\lower .5ex\hbox{J}\kern-.17em\TeX} +\def\JLaTeX{\leavevmode\lower.5ex\hbox{J}\kern-.17em\LaTeX} +\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em + T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} + +\def\JBibTeX{\leavevmode\lower .5ex\hbox{{\rm J}}\kern-0.15em\BibTeX} +\def\trnote#1{\footnote{\parindent=16pt\hskip-15pt\hang\indent 訳注:#1\parindent=10pt}} + +\title{B\kern-.05em{\large I}\kern-.025em{\large B}\kern-.08em\TeX ing: +B\kern-.05em{\large I}\kern-.025em{\large B}\kern-.08em\TeX の使い方 +\footnote{翻訳の部分は原著者の許可を得て配布するものであり,翻訳について, +\JBibTeX\ に関する記述については松井に問い合わせられたい.} +$^,$\footnote{\JBibTeX\ (version 0.30)の説明も含む.}} +\author{Oren Patashnik(訳:松井正一)} +\date{January 31, 1988(翻訳版:1991年1月1日)} + +\begin{document} + +\maketitle + +\section{概要} + +[この文書は\BibTeX\ version 1.00が完成した時に拡充される. +タイプミス,欠落,不正確な部分,特に,分かりにくい部分について, +著者まで連絡されたい({\tt patashnik@SCORE.STANFORD.EDU}, 日本語および +\JBibTeX\ に関する部分は{\tt matsui@denken.or.jp}). +改善に関する意見を歓迎する.] + +これは\BibTeX\ version 0.99a\trnote{version 0.99a以降の +意味であり,\JBibTeX の基になっている0.99cも含まれる.} +の利用者のためのものであり\trnote{\JBibTeX 利用者のためでもある. +\JBibTeX については\cite{jbibtex}も参照されたい.}, +参考文献スタイルの設計者(製作者)はこの文書を読んだ後,製作者のためだけに +書かれている ``Designing \BibTeX\ Styles''~\cite{btxhak}を読む必要がある. + +本稿は以下の3節からなる. +第\ref{相違点} 節で \BibTeX のversion 0.98iと0.99aの相違点を, +各々に対応する標準スタイルファイルの相違点とともに述べる. +第\ref{latex-appendix} 節は\LaTeX\ book~\cite{latex}の付録B.2の修正であり, +第\ref{odds-and-ends} 節で他の文書には書かれていない一般的事項,特殊事項に +ついて述べる. +本稿の読者は\LaTeX\ bookの関連する節に精通していることが望まれる. + +この文書は\BibTeX\ を走らせる作業を助けるための入力例としての役割も持つ. +多くの文書と同じくこの文書も参考文献の引用を含んでいる.参考文献リストを +作るためには, +この文書自身を処理するためには, +先ず({\tt aux}ファイルを作るために)\LaTeX\ を実行し, +次に({\tt bbl}ファイルを作るために)\BibTeX\ を実行し, +最後に\LaTeX をもう2回実行する(1回は{\tt bbl}ファイル中の情報を +取り込むためであり,もう1回は前方参照を解決するためである). +めったに起こらないことではあるが,さらにもう1回 +\BibTeX/\LaTeX\ を走らせなければならないこともある. + +\BibTeX\ version 0.99aは,closed参考文献書式を標準としている. +\LaTeX\ version 2.09とともに使う必要がある\trnote{\JBibTeX\ は +\JLaTeX\ とともに使う.}. +open参考文献書式にするためにはオプション文書スタイルの{\tt openbib} +を使う必要がある. +(open書式では主ブロックの間で改行が行われるが,closedでは行われない.) + +{\dg 注意}:\BibTeX\ 0.99aでは古いスタイルファイルは使えない,同様に +\BibTeX\ 0.98iでは新しいスタイルファイルは使えない. +(しかし新しい\BibTeX\ で古いデータベースファイルを使うことはできる.) + +{\dg インプリメンタへの注意}:\BibTeX\ には +参考文献スタイルファイルの入力ディレクトリのための{\tt TEXINPUTS:}と, +データベースファイルの入力ディレクトリのための{\tt BIBINPUTS:} +の2つの論理名\trnote{UNIX/MS-DOSではそれぞれ{\tt TEXINPUTS}と +{\tt BIBINPUTS}の環境変数}が用意されている. + +\vskip\baselineskip +{\dg\bf\JBibTeX\ での注意点}: +漢字コード系は{\tt BIBTERMCODE, BIBFILECODE}の2つの +環境変数で変更可能であり,\linebreak \JTeX\ の\verb|\kanjiterminaltype, \kanjifiletype|に +指定するのと同じものを指定する.UNIX版ではサイト毎に標準コードが設定されて +いるはずであり,MS-DOS版ではSJISが標準である. + +\newpage +\section{変更点} +\label{相違点} +本節では\BibTeX\ versions 0.98iと0.99aの違いと,各々のバージョンに対応する +スタイルの違いについて述べる.0.98iと0.99aの間には +多くの相違点があるが0.99と1.00の間ではもっとずっと少なくなるであろう. + +\subsection{\BibTeX\ の新機能} +\label{features} + +以下に\BibTeX\ の新機能とその使い方を列挙する\trnote{\JBibTeX\ の機能でも +ある.}. + +\begin{enumerate} + +\item +個々の文献毎に\verb|\cite|, \verb|\nocite|を明示的に指定しなくても, +`\verb|\nocite{*}|' コマンドひとつで, +データベース中のすべての文献を並べたリストを作ることができる. +これは,このコマンドを +使った場所で,データベース中のすべてのエントリをその +順番で\verb|\nocite|することに相当する. + +\item +\label{concat} +フィールド(あるいは{\tt @STRING}の定義中で)文字列の連結を指定できる. +例えば,次のように定義しておくと, +\begin{verbatim} + @STRING( WGA = " World Gnus Almanac" ) +\end{verbatim} +別々ではあるが似たような{\tt title}エントリを簡単に作れる. +\begin{verbatim} + @BOOK(almanac-66, + title = 1966 # WGA, + . . . + @BOOK(almanac-67, + title = 1967 # WGA, +\end{verbatim} +次のような使い方も可能である. +\begin{verbatim} + month = "1~" # jan, +\end{verbatim} +この時,スタイルファイル中での{\tt jan}の省略形の定義によって異なるが, +{\tt bbl}ファイル中では `\verb|1~Jan.|' あるいは +`\verb|1~January|' のようになる. +(フィールドのデータ長には上限があるが) `{\tt\#}' によって +任意の数の文字列を連結できる. +`{\tt\#}' の前後には,スペース\trnote{漢字コードの +スペース(空白)ではダメ!}か改行を置くことを忘れてはならない. + +\item +\BibTeX\ に新たな相互参照機能を付け加えた.これを例にそって説明する. +文書中に\verb|\cite{no-gnats}|と指定し, +データベース中に次の2つのエントリがあるとしよう. +\begin{verbatim} + @INPROCEEDINGS(no-gnats, + crossref = "gg-proceedings", + author = "Rocky Gneisser", + title = "No Gnats Are Taken for Granite", + pages = "133-139") + . . . + @PROCEEDINGS(gg-proceedings, + editor = "Gerald Ford and Jimmy Carter", + title = "The Gnats and Gnus 1988 Proceedings", + booktitle = "The Gnats and Gnus 1988 Proceedings") +\end{verbatim} +この時,次に述べる2つのことがおこる. +第1に,特別な意味を持つフィールド{\tt crossref}は,{\tt no-gnats} +エントリで欠落しているフィールドを, +引用している{\tt gg-proceedings}から継承することを\BibTeX に +伝える.先の例でいえば{\tt editor}と{\tt booktitle}の2つを +継承する. +ただし,標準のスタイルでは{\tt booktitle}フィールドは +{\tt PROCEEDINGS}型のエントリでは意味を持たない. +この例の{\tt gg-proceedings}エントリの{\tt booktitle}フィールドは, +これを参照している +ものがこのフィールドを継承できるようにするためだけのものである. +この会議の論文がどんなに多くデータベース中にあっても, +この{\tt booktitle}フィールドは1回だけ書けばよい. + +第2に, {\tt gg-proceedings}エントリを +\verb|\cite|あるいは\verb|\nocite|で引用している +2つ以上の論文が参\linebreak 照していると, このエントリ自身が +\verb|\cite|あるいは\verb|\nocite|されていなくても, +\BibTeX は自動的\linebreak に{\tt gg-proceedings}エントリを参考文献リストに +加える.つまり{\tt no-gnats}の他に1つ以上の論文が\linebreak {\tt gg-proceedings}を +参照していると,自動的に参考文献リストに加えられる. + +ただし,上記の結果となることを保証するためには, +相互参照されているエントリは, +それを引用しているすべてのエントリよりデータベースファイル中で +後ろになければならない. +従って,相互参照されているエントリは最後に置くことになる. +(さらに,残念なことだが,ネストされた相互参照 +はうまく扱えない.すなわち,相互参照している先がさらに他を参照している +場合にはうまく動作しないことがある.) + + +最後の注意: +この相互参照機能は,現在でも利用できる,古い\BibTeX の +参照の機能とは全く関係がない. +すなわち,次のような使い方は新しい機能から何の影響も受けない. +\begin{verbatim} + note = "Jones \cite{jones-proof} improves the result" +\end{verbatim} + + +\item +\BibTeX\ はアクセント付き文字(accented character)を扱えるようになった. +例えば次のような2つのフィールドからなるエントリがあり, +\begin{verbatim} + author = "Kurt G{\"o}del", + year = 1931, +\end{verbatim} +参考文献スタイルとして{\tt alpha}を使ったとすると, +\BibTeX\ はこのエントリのラベルをあなたの望み通りに [G{\"o}d31] とする. +このような結果を得るためには\verb|{\"o}|あるいは\verb|{\"{o}}|のように +アクセント付き文字列を中括弧(ブレース; \verb|{}|)で囲んでやる必要がある. +さらに,このために使う中括弧は,フィールドやエントリの区切り以外の中括弧の +中に含まれてはならないし,中括弧の中の一番最初の文字はバックスラッシュ +でなければならない.従ってこの例でいえば\verb|{G{\"{o}}del}| +でも\verb|{G\"{o}del}|でもうまくゆかない. + +この機能は\LaTeX~bookの表3.1と表3.2にある,バックスラッシュの付かない +外国文字(foreign symbols)を除く,すべてのアクセント付き文字を扱うことができる. +この機能は利用者が定義する「アクセント付き文字」でも使える.すぐ後で例を示す. +ラベルの文字数を数える場合には,\BibTeX\ は中括弧の中の +文字列をまとめて1文字と数える. + + +\item +\BibTeX\ はハイフン付きの人名も扱うことができる.例えば,次のような +エントリ, +\begin{verbatim} + author = "Jean-Paul Sartre", +\end{verbatim} +で{\tt abbrv}スタイルを使うと,結果は `J.-P. Sartre' となる. + +\item +\label{preamble} +データベースファイル中に\verb|@PREAMBLE|を書くことができる. +コマンドは,文字列からなり,名前と等号記号がないことを +除けば\verb|@STRING|と同じである.以下に例を示す. +\begin{verbatim} + @PREAMBLE{ "\newcommand{\noopsort}[1]{} " + # "\newcommand{\singleletter}[1]{#1} " } +\end{verbatim} +(ここでも文字列連結の機能が使われていることに注意しよう). +標準のスタイルでは,ここに書いた文字列(多くの場合\LaTeX\ のマクロ) +をそのまま{\tt bbl}ファイルに書き出す. +上に示した\verb|\noopsort|コマンドを例に,使い方を示す. + +ソーティングする(アルファベット順に並べる)ことを考えよう. +\BibTeX\ は割とうまく並べてくれるが,条件によっては\BibTeX\ が +混乱することがある. +データベースの中に同一著者による2巻からなる本のエントリがあり, +参考文献リストでは第1巻が第2巻の直前に並んで欲しいとしよう. +さらに第1巻には1973年に発刊された第2版があり,第2巻には第1版しかなく +その発刊は1971年であったとしよう. +標準スタイル{\tt plain}は著者名と発刊年でソートキーを作り, +第2巻の方が発刊が早いために,\BibTeX\ を助けてやらない限り,第2巻 +の方が先にならんでしまう. +このためにはこの2つの{\tt year}フィールドを次のようにする. +\begin{verbatim} + year = "{\noopsort{a}}1973" + . . . + year = "{\noopsort{b}}1971" +\end{verbatim} +\verb|\noopsort|の定義から, +\LaTeX\ は年としては本当の年以外は印刷しない. +しかし\BibTeX\ は\verb|\noopsort|の指定が `a', `b' を +修飾するものとみなすので,ソートの時にはあたかも `a1973' と `b1971' +が年のように扱う.`a' は `b' より前なので,望み通り第1巻が第2巻の前に並ぶ. +ところで,もしこの著者の別の著作がデータベース中にある場合には +他の著作との関係を正しくするために\verb|{\noopsort{1968a}}1973|と +\verb|{\noopsort{1968b}}1971|といったように書かねばならないこともある. +(ここでは第1巻の第1版の発刊年が1968年であることから,これで正しい +場所に並ぶものと考えている.) + +使える\verb|@PREAMBLE|コマンドの数には上限があるが,\verb|@PREAMBLE| +の数を1つのデータベースにつき1つにしておけば,上限を超えることはない. +したがって,項目\ref{concat} で述べた,文字列の連結機能を使えば +この制限は大した問題ではない. + +\item +\BibTeX\ のソーティング算法は安定(stable)なものとなった.つまり, +2つの異なるエントリが同一のソートキーを持つ場合には, +引用順に並ぶようになった. +(参考文献スタイルがこれらのソートキー,通常は著者名の後に年と +表題を付加したもの,を作る\trnote{日本語用のスタイルでは, +yomiというフィールドがあればそれを著者名の代わりに使うことで,読みの +アルファベット順に並ぶようにしている.}) + +\item +\BibTeX\ はファイル名の小文字/大文字変換を行わないようになった. +これにより,例えばUNIXシステム上に\BibTeX\ をインストールするのが簡単になった. + +\item +コマンドラインの{\tt aux}ファイル名の処理を行うコードを付加することが +簡単に行えるようになった. + +\end{enumerate} + + +\subsection{標準スタイルの変更点} + +本節では,一般利用者に関係する標準スタイル +({\tt plain}, {\tt unsrt}, {\tt alpha}, {\tt abbrv}) +の変更点について述べる\trnote{対応する日本語用のスタイルは +各々{\tt jplain}, {\tt junsrt},{\tt jalpha}, {\tt jabbrv}である.}. +スタイル作成者に関係した変更点は +``Designing \BibTeX\ Styles''~\cite{btxhak}に述べられている. + +\begin{enumerate} + +\item +一般にソーティングは先ず ``author'' で,次に年,最後に表題で行う. +古いバージョンでは年が使われていなかった. +(しかし{\tt alpha}スタイルでは先ずラベル +でソートした後,上記のソートを行う). +authorの前後に引用符が付いているのは,editor, organizationなどの +他のフィールドが使われることもあるからである. + +\item +多くの不必要なタイ(\verb|~|)を取り除いた. +これにより,参考文献リストをフォーマットした時に, +\LaTeX\ から出力される `\hbox{\tt Underfull} \verb|\hbox|' +の数が少なくなった. + +\item +イタリック指定(\hbox{\verb|{\it ...}|})を +強調指定(\hbox{\verb|{\em ...}|})に置き換えた. +出力は変化しないはずである. + +\item +{\tt alpha}スタイルでは,ラベルを作る際に著者名のいくつかを省略した +ことを示す記号を `*' から `$^{+}$' に変更した. +しかし,以前の形式の方が好き,あるいはこんな記号が不要な場合でも +スタイルファイルの修正は不要である. +{\tt alpha}スタイルが(\verb|\thebibliography| environmentの直前に) +{\tt bbl}ファイルに書き出す\verb|\etalchar| +コマンドを,前節の第\ref{preamble} 項目で述べたように, +データベース中の{\tt @PREAMBLE}を使って, +\LaTeX\ の\verb|\renewcommand|を用いて定義し直せば,`$^{+}$' +の形式を変更できる. + +\item +{\tt abbrv}スタイルでは,月名として`March'と`Sep.' +の替わりに`Mar.'と`Sept.'を使うようになった. + +\item +標準スタイルでは, +\BibTeX\ の新しい相互参照機能を使っている場合には, +他の文献を参照しているエントリに対しては, +参照先に記述されているフィールドのほとんど全てを省略し, +\verb|\cite|を使って参照を示すようになっている. + +これは参照元が大部な著作の一部分である場合に使う. +このような状況としては以下の5つが考えられる. +(1) {\tt INPROCEEDINGS} +(あるいは{\tt CONFERENCE}, どちらも同じこと) +が{\tt PROCEEDINGS}を参照している; +(2) {\tt BOOK}, (3) {\tt INBOOK}, +あるいは(4) {\tt INCOLLECTION} +が{\tt BOOK}を参照している +(複数巻からなる書物の中のある1巻が参照している); +(5) {\tt ARTICLE}が{\tt ARTICLE}を参照している. +(この場合には,参照されているものは実は論文誌全体であるが, +エントリ型として{\tt JOURNAL}がないからこうする. +この時には論文誌の{\tt author}と{\tt title}がないという +警告メッセージが出力されるが,このメッセージは無視すればよい). + +\item +{\tt MASTERSTHESIS}と{\tt PHDTHESIS} +エントリ型では,任意フィールドとして{\tt type}を書けるようになった. +これにより, +\begin{verbatim} + type = "{Ph.D.} dissertation" +\end{verbatim} +とデータベース中に書くことで,標準の `PhD thesis' の替わりに +`Ph.D.\ dissertation' とできるようになった. + +\item +同様に{\tt INBOOK}と{\tt INCOLLECTION} +エントリ型では,任意フィールドとして{\tt type}を書けるようになった. +これを使えば,次のようにデータベースに書いておけば, +標準の `chapter~1.2' の替わりに,`section~1.2' とできる. +\begin{verbatim} + chapter = "1.2", + type = "Section" +\end{verbatim} + +\item +{\tt BOOKLET}, {\tt MASTERSTHESIS}, +{\tt TECHREPORT}エントリ型では, +{\tt BOOK}の{\tt title}のようにではなく, +{\tt ARTICLE}の{\tt title}のように, +表題をフォーマット(タイプセット)するようになった. + +\item +{\tt PROCEEDINGS}と{\tt INPROCEEDINGS} +エントリ型では,{\tt address}フィールドを出版社,主催者の住所を +示すために使うのではなく,会議の開催された場所を示すために使うように +なった. +出版社,開催者の住所を入れたいのであれば, +{\tt publisher}か{\tt organization}フィールドに入れること. + +\item +{\tt BOOK}, {\tt INBOOK}, {\tt INCOLLECTION}, +{\tt PROCEEDINGS}エントリ型では,{\tt volume}だけを +許すのではなく, +{\tt volume}か{\tt number}のいずれか一方を許すようになった. + +\item +{\tt INCOLLECTION}エントリ型では,{\tt series}と{\tt edition} +フィールドを許すようになった. + +\item +{\tt INPROCEEDINGS}と{\tt PROCEEDINGS} +エントリ型では, +{\tt volume}または{\tt number}と +{\tt series}を許すようになった. + +\item +{\tt UNPUBLISHED} エントリ型では,日付情報を後に付けて, +{\tt note}フィールドを1つのブロックとして出力するようになった. + +\item +{\tt MANUAL}エントリ型では,{\tt author}フィールドが +空であれば,{\tt organization}フィールドを第1ブロックとして +出力するようになった. + +\item +{\tt MISC}エントリ型では,全ての任意フィールド +(すなわち全てのフィールド)が空の時には +警告メッセージを出力するようになった. + +\end{enumerate} + +\subsection{\JBibTeX\ の標準スタイル} + +\JBibTeX\ の標準スタイルとしては{\tt plain, alpha, abbrv, unsrt}に対応して +{\tt jplain, jalpha, jabbrv,\linebreak junsrt}が作成されている.また情報処理学会 +論文誌{\tt tipsj}, 情報処理学会欧文論文誌{\tt jipsj}, 電子情報通信学会論文誌{\tt tieice}, +日本オペレーションズリサーチ学会論文誌{\tt jorsj}, +人工知能学会{\tt jsai}, ソフトウェア学会{\tt jssst}用のスタイルも作成されて +いる.これらのスタイルで行なっている日本語対応は以下の通りである({\tt jipsj} +は英語なので,変更は必ずしも日本語対応のためだけではない). + +\begin{enumerate} +\item 著者名が日本語かどうかで名前のフォーマットの方法を変える. + +\item 著作名に日本語が含まれる場合には強調指定を付けない. + +\item ページ範囲指定を{\tt Page}, {\tt Pages}から{\tt p.}, {\tt pp.}に +変更した.ナンバー指定,ボリューム指定を{\tt No.}, {\tt Vol.}に変更した. + +\item ソーティングキーを作る時には,{\tt yomi}フィールドがあればその情報を +著者名,編集者名の代りに使う. +\end{enumerate} + +\section{データベースのエントリ} +\label{latex-appendix} + +本節は\LaTeX\ book~\cite{latex}, +\copyright~1986, by Addison-Wesley の付録B.2の単なる修正版である. +基本構成は同じであり,細目が少し変更されている. + +\subsection{エントリの型} + +参考文献をデータベースに登録する場合に一番最初に決めなければ +ならないことは,その型(種類)である.完全な決まったやり方はないが, +\BibTeX\ ほとんどすべての文献を合理的に扱うためのエントリの型を +用意している. + +文献の出版形態が異なればそれが持っている情報も異なる. +論文誌に発表されたものには論文誌の巻数(volume)と番号(number)があるが, +本の場合にはこれらは通常意味がない. +従って異なったエントリ型毎に異なったフィールドがある. +エントリの型毎にフィールドは以下の3つに分類される. +\begin{description} + +\item[必須] +これが欠落していると警告メッセージが出力され,まれにではあるが +文献リストが変な形に出力される. +もし必須な情報が意味を持たないのであれば,間違った型を指定しているのである. +必須な情報が意味を持つのであるが,他のフィールドにそれが記述されている +場合には警告メッセージを無視すればよい. + +\item[任意] +このフィールドは,もしあれば使われるが,何の問題もなしに省略できる. +もしこれらのフィールドの情報が読者を助けるのであれば, +これを省略しない方がよい. + +\item[無視される] +このフィールドは無視される. +\BibTeX\ は必須あるいは任意のフィールド以外は無視するから,{\tt bib}ファイル +には好きなフィールドを書いてよい. +参考文献リストには出力されないかもしれないが, +文献に関連するすべての情報を{\tt bib}ファイルに書いておくとよい. +例えば,論文のアブストラクトをコンピュータのファイルにとっておくのであれば, +{\tt bib}ファイル中の{\tt abstract}フィールドに入れておけばよい. +{\tt bib}ファイルはアブストラクトを入れて置くにちょうどよい場所であり, +アブストラクト付きの文献リストを作成するスタイルを作ることもできる. + +{\dg 注意}:フィールド名をミススペルするとそのフィールドは無視される. +特に任意フィールドの場合には\BibTeX\ は警告メッセージを出さないから, +タイプミスに注意しなければならない. + +\end{description} + +以下で各々のエントリの型について説明を行う. +同時に,文献リストの項目として並べられる順番に +(エントリ型によっては特定のフィールドのあるなしで若干順番が異なることもあるが) +必須フィールド,任意フィールドを示す. +これらエントリの型は,{\em Scribe}システムのためにBrian Reidが +採用したvan~Leunen~\cite{van-leunen}の分類と同じものである. +個々のフィールドの意味については次節で説明する. +標準以外のスタイルでは任意フィールドのいくつかを無視することがある. +{\tt bib}ファイル中ではエントリの型の前に{\tt @}文字を +付けるのを忘れてはならない. + + +\begin{description} +\sloppy + +\item[article\hfill] 論文誌中の論文,雑誌の記事. +必須フィールド:{\tt author}, {\tt title}, {\tt journal}, +{\tt year}. +任意フィールド:{\tt volume}, {\tt number}, +{\tt pages}, {\tt month}, {\tt note}. + +\item[book\hfill] 出版主体が明確な本. +必須フィールド:{\tt author}または{\tt editor}, +{\tt title}, {\tt publisher}, {\tt year}. +任意フィールド:{\tt volume}または{\tt number}, {\tt series}, +{\tt address}, {\tt edition}, {\tt month}, +{\tt note}. + +\item[booklet\hfill] 印刷,製本されているが,出版者あるいはスポンサー +の名前がないもの. +必須フィールド:{\tt title}. +任意フィールド:{\tt author}, {\tt howpublished}, +{\tt address}, {\tt month}, {\tt year}, {\tt note}. + +\item[conference\hfill] {\tt INPROCEEDINGS}と同じ. +{\em Scribe\/}との互換性のため. + +\item[inbook\hfill] 章(あるいは節などの)本の一部分かつ/または(and/or) +本のあるページ範囲. +必須フィールド:{\tt author}あるいは{\tt editor}, {\tt title}, +{\tt chapter}かつ/または{\tt pages}, {\tt publisher}, +{\tt year}. +任意フィールド:{\tt volume}または{\tt number}, {\tt series}, +{\tt type}, {\tt address}, +{\tt edition}, {\tt month}, {\tt note}. + +\item[incollection\hfill] それ自身の表題を持つ本の一部. +必須フィールド:{\tt author}, {\tt title}, {\tt booktitle}, +{\tt publisher}, {\tt year}. +任意フィールド:{\tt editor}, {\tt volume}または{\tt number}, +{\tt series}, {\tt type}, {\tt chapter}, {\tt pages}, +{\tt address}, {\tt edition}, {\tt month}, {\tt note}. + +\item[inproceedings\hfill] 会議録中の論文. +必須フィールド:{\tt author}, {\tt title}, {\tt booktitle}, +{\tt year}. +任意フィールド:{\tt editor}, {\tt volume}または{\tt number}, +{\tt series}, {\tt pages}, {\tt address}, {\tt month}, +{\tt organization}, {\tt publisher}, {\tt note}. + +\item[manual\hfill] マニュアル. +必須フィールド:{\tt title}. +任意フィールド:{\tt author}, {\tt organization}, +{\tt address}, {\tt edition}, {\tt month}, {\tt year}, +{\tt note}. + +\item[mastersthesis\hfill] 修士論文. +必須フィールド:{\tt author}, {\tt title}, {\tt school}, +{\tt year}. +任意フィールド:{\tt type}, {\tt address}, {\tt month}, +{\tt note}. + +\item[misc\hfill] 他のどれも当てはまらない時に使う. +必須フィールド:なし. +任意フィールド:{\tt author}, {\tt title}, {\tt howpublished}, +{\tt month}, {\tt year}, {\tt note}. + +\item[phdthesis\hfill] 博士論文. +必須フィールド:{\tt author}, {\tt title}, {\tt school}, +{\tt year}. +任意フィールド:{\tt type}, {\tt address}, {\tt month}, +{\tt note}. + +\item[proceedings\hfill] 会議録. +必須フィールド:{\tt title}, {\tt year}. +任意フィールド:{\tt editor}, {\tt volume}または{\tt number}, +{\tt series}, {\tt address}, {\tt month}, +{\tt organization}, {\tt publisher}, {\tt note}. + + +\item[techreport\hfill] 学校などで発行されているテクニカルレポートであり, +通常は通番を持つ. +必須フィールド:{\tt author}, +{\tt title}, {\tt institution}, {\tt year}. +任意フィールド:{\tt type}, {\tt number}, {\tt address}, +{\tt month}, {\tt note}. + +\item[unpublished\hfill] 正式には主版されていないが,著者,表題のある著作物. +必須フィールド:{\tt author}, {\tt title}, {\tt note}. +任意フィールド:{\tt month}, {\tt year}. + +\end{description} + +上に示したフィールドに加えて,各々のエントリ型では任意フィールドとして +{\tt key}があり,スタイルによっては並べ替え,相互参照,あるいは +\verb|\bibitem|を作るのに使われる. +また,「著者」情報が欠けているエントリに対しては必ず{\tt key}フィールド +を入れておかないといけない. +「著者」は通常は{\tt author}フィールドに書くが, +エントリの型によっては,{\tt editor}フィールド +であったり,あるいは{\tt organization}フィールドであったりもする +(第\ref{odds-and-ends} 節でもっと詳しく説明する). +{\tt key}フィールドを\verb|\cite|に現れるデータベースのエントリの +最初に書くキーと混同してはならない.この項目が ``key'' という名前 +なのは{\it Scribe}との互換性のためである. + +\vskip\baselineskip +{\dg\bf \JBibTeX\ での注意}:\JBibTeX\ の標準スタイルでは +以下に示されているフィールドの他に,任意フィールドとして, +漢字コード表記された著者名の「読み」を書くためのフィールドとして +{\tt yomi}がある. + +\subsection{フィールド} + +標準スタイルで認識されるフィールドを以下に示す. +標準スタイルでは無視されるが,この他の任意のフィールドを +書いてもよい\trnote{\JBibTeX\ の標準スタイル用に{\tt yomi}フィールドが +追加されている.} + +\begin{description} + +\item[address\hfill] +通常は{\tt publisher}などの住所を書く. +van~Leunenは,大きな出版社に対してはこれを省略することを勧めている. +他方,小さな出版社に対しては,読者の便を考えて,完全な住所を書くとよい. + +\item[annote\hfill] +注釈. +標準のスタイルでは使われないが,他の注釈つきの参考文献スタイルで使われる. + +\item[author\hfill] +著者名であり,\LaTeX\ bookに説明されているように書く\trnote{\JBibTeX\ では, +漢字コード著者名の姓と名の間にはスペース(半角でも全角でも)を置くことが +望ましい(スペースがないと{\tt jabbrv}スタイルなど省略形が基本のスタイルの +時に姓だけにならない).}. + +\item[booktitle\hfill] +一部分を引用する本の表題. +記述の方法については\LaTeX\ bookを参照のこと. +エントリ型が本({\tt book})の場合には{\tt title}を使う. + +\item[chapter\hfill] +章(あるいは節などの)番号. + +\item[crossref\hfill] +参照する文献のデータベースキー. + +\item[edition\hfill] +本の版---例えば ``Second''. +(日本語以外では)順序数で書くこと,また最初の文字は上記の例のように +大文字のこと.必要であれば標準スタイルが自動的に小文字に変換する. + +\item[editor\hfill] +編集者の名前を\LaTeX\ bookの説明のように書く. +{\tt author}フィールドもある場合には,ここには論文が載っている +本あるいは論文集の編集者名を書く\trnote{\JBibTeX\ では, +編集者名の姓と名の間にはスペースを置くことが望ましい(スペースが +ないと{\tt jabbrv}スタイルの時に姓だけにならない).}. + +\item[howpublished\hfill] +この奇妙な著作がどのようにして出版されたか. +最初の文字は大文字でなければならない. + +\item[institution\hfill] +テクニカルレポートのスポンサー名. + +\item[journal\hfill] +論文誌の名前. +多くの論文誌の省略形が用意されている. +{\it Local Guide}を参照のこと. + +\item[key\hfill] +著者に関する情報(第\ref{odds-and-ends} 節参照)がない時に +ソーティング,相互参照,ラベル作成の処理に使われる. +このフィールドを,データベースエントリの最初の項目である +\verb|\cite|で使うキーと混同してはならない. + +\item[month\hfill] +著作物が出版された月.未出版であれば書かれた月. +\LaTeX\ bookの付録B.1.3に示されている3文字の省略形を使うこと\trnote{ +念のために列挙すると{\tt jan, feb, mar, apr, may, jun, +jul, aug, sep, oct, nov, dec}}. + +\item[note\hfill] +読者を助ける付加的な情報を記述する. +最初の文字は大文字でなければならない. + +\item[number\hfill] +論文誌,雑誌,テクニカルレポートあるいは一連の著作の番号. +通常,論文誌,雑誌の特定の号は巻数と番号で識別され,テクニカルレポート +を発行している機関はレポートに番号を振っている.またシリーズの +本にも番号がある. + +\item[organization\hfill] +会議のスポンサーあるいはマニュアル{\tt manual}を出版した機関の名称. + +\item[pages\hfill] +{\tt 42--111}, {\tt 7,41,73--97}, {\tt 43+}などの(いくつかの)ページあるいは +ページ範囲(最後の例は後続ページが単純な範囲でないことを示す). +{\em Scribe}互換のデータベースの維持を簡単にするため,標準のスタイルでは +{\tt 7-33}のようなダッシュ1つの形式を\TeX\ での数値範囲の指定形式である +{\tt 7--33}のようなダッシュ2つに自動的に変換する. + +\item[publisher\hfill] +出版主体の名称. + +\item[school\hfill] +修士論文,博士論文が書かれた(提出された)大学名. + +\item[series\hfill] +一連の書物のシリーズ名,セット名. +本全体を引用する場合には,{\tt title}フィールドにその本の +表題を書き,任意フィールドである{\tt series}にシリーズ名 +あるいは複数巻の書物の題名を書く. + +\item[title\hfill] +著作の表題.\LaTeX\ bookの説明のようにタイプセットされる. + +\item[type\hfill] +テクニカルレポートの種類---例えば ``Research Note''. + +\item[volume\hfill] +論文誌あるいは複数巻の書物の巻数. + +\item[year\hfill] +著作物が出版された年.未出版であれば書かれた年. +標準スタイルは,`{(about 1984)}' のような,どんな形でも{\tt year}フィールド +に許すが,区切り文字以外の最後の4文字は, +通常は{\tt 1984}のような4つの数字から構成されていなくてはならない. + +\item[yomi\hfill]{\dg\bf\JBibTeX\ のみで意味を持つ}. +著者(編集者)名が日本語文字の時にソート,ラベル作成がうまくいくように +漢字コード氏名の代りに使うフィールドであり,ローマ字表記した姓名を著者名などと +同じ書き方で記述する(ひらがなで書いて五十音順にソートしたりもできる). +例を示す. +\begin{verbatim} + author="松井 正一 and 高橋 誠", + yomi="Shouichi Matsui and Makoto Takahasi" +\end{verbatim} +\end{description} +\newpage + +\section{ヒント} +\label{odds-and-ends} + +本節では,他では詳しく説明されていない事項を解説する. +簡単なものから順に説明する. +その前に先ず口上を述べたい. + +参考文献のタイプセットスタイルの選択の余地は少ない.論文誌$X$は$Y$の +スタイルを指定するし,また別の論文誌は別のものを指定する. +しかし,選択の余地があるのであれば,{\tt plain}標準スタイルを使うことを +勧める. +このスタイルは,他のものより具体的で生き生きした,より良い著作と +なるとvan~Leunen~\cite{van-leunen}は主張している. + +他方で, +{\em The Chicago Manual of Style\/}~\cite{chicago}, +は引用が本文中に `(Jones, 1986)' のように +現れる「著者-年月日形式(author-date)」を推奨している. +しかし,私はこのような方式は関連する/しない情報が散乱するだけでなく, +本文が漠然とし,たいしたことではないかも知れないが受動態や曖昧な文が多くなると +考える.さらにコンピュータタイプセットの出現により, +「これが最も実用的な方法である」といった議論は +まったく意味のないものとなったと考える. +例えば,{\em Chicago Manual\/}の401ページの中ごろに述べられている, +「{\tt plain}のようなスタイルの欠点は,タイプした後では, +引用文献の追加・削除のためには, +参考文献リストの修正だけでなく,本文中の番号の修正が必要なことである」 +といった主張はまったくの時代錯誤といえる. +\LaTeX\ を使えば欠点ではないことは明らかである. + +最後に, +「著者名-年月日形式」の論理的欠陥はそのためのプログラムを作成してみると +非常に明白になる.例えば,多数の参考文献リストを普通にアルファベット順 +に並べた時に,`(Aho et~al., 1983b)' が `(Aho et~al., 1983a)' の半ページ +も後に並ぶことがある. +これを修正するともっと悪くなることもある. +なんてこった. +(悲しいことに,私はそういったスタイルをプログラムしたことがある. +阿呆な出版者のせいで,あるいは私の主張に同調せずに,このような +スタイルを使いたいのであれば, +この方式のスタイルはRochester style collectionから入手可能である.) + +前口上が長くなってしまったが,私の気分は良くなり,血圧も正常に戻った. +以下に標準スタイルで\BibTeX\ を使う時のヒントを示す(標準以外のスタイルでも +多くの事柄があてはまる). + +\begin{enumerate} + +\item +\BibTeX\ のスタイル設計言語を使えば,参考文献のリスト作成以外にも, +一般的なデータベース操作のためのプログラムを作ることができる. +これを使ってデータベース中のすべての文献のデータベースキー/著者の +索引を生成するプログラムを作ることは,この言語に精通していれば簡単な +ことである. +どんなツールが用意されているかについては{\em Local Guide\/} +を参照されたい. + +\item +標準スタイルで使っている13個のエントリ型でほとんどの文献をうまく +フォーマットできるが,13個だけでなんでもうまくできるわけではない. +したがって,エントリ型の使い分けを工夫するとよい(しかし, +余りにいろんな型を試してみないとうまくいかないのは, +エントリの型が間違っていることが多い). + +\item +フィールド名は厳格に考えなくてよい. +例えば,出版者の住所を{\tt address}フィールドではなく, +名前とともに{\tt publisher}フィールドに入れることもできる. +あるいは,複雑な形式の文献には{\tt note}フィールドをうまく使うことで +対処できる. + +\item +警告メッセージは深刻に考える必要はない. +例えば{\em The 1966 World Gnus Almanac}のように,表題に年が +入っている文献では,{\tt year}フィールドは省略した方がよく, +\BibTeX\ の警告メッセージは無視してよい. + +\item +{\tt author}, {\tt editor}の名前が余りに多い時には名前リストを +``and others'' で終りにしておけば,標準スタイルでは +``et~al.'' に自動的に変換される\trnote{\JBibTeX では, +漢字コード著者なら ``ほか'' に変換される.}. + +\item +一般に,\BibTeX\ が大文字を小文字に自動的に変換するのを +止めさせたかったら,中括弧({\tt \{ \}})で囲めばよい. +しかし,左中括弧に続く最初の文字がバックスラッシュであると, +変換されることもある. +「特殊文字」のところで再び説明する. + +\item +{\em Scribe\/}との互換性のため,データベースファイル中に {\tt @COMMENT} +コマンドを書くことができる. +\BibTeX\ はデータベースファイル中ではエントリの内側 +以外ならどこにでもコメントを書くことを許すから, +実際にはこのコマンドは不要である. +あるエントリをコメントアウトするには,単にエントリの型の +前の{\tt @}文字を取り除けばよい. + +\item +標準スタイルファイル中には計算機科学関係の論文誌の +省略形がいくつか入れてあるが,これはあくまでも例である. +これと異なる論文誌の省略形は {\tt @STRING}コマンドを +使って,個人のデータベースで定義するのがよい. +そして\LaTeX\ の\verb|\bibliography|指定の最初の引数として, +この省略形の入ったデータベースを記述すればよい. + +\item +「月」に関しては,自分で月名を書かずに,3文字の省略形を使うのがよい. +そうすれば整合的な形式となる. +「日」の情報も含めたい場合には{\tt month}フィールドに書く.例えば, +\begin{verbatim} + month = jul # "~4," +\end{verbatim} +とすれば,望みの結果が得られる. + +\item +(参考文献が引用順に列挙される) {\tt unsrt}スタイルを\verb|\nocite{*}| +(データベースのすべての文献が列挙される)と +共に使う場合には,文書中の\verb|\nocite{*}|コマンドの位置で +引用文献の並ぶ順番が決まる. +第\ref{features} 節で示した規則によれば, +コマンドが文書の先頭にあれば,データベース中の順番そのものになり, +最後にあれば,\verb|\cite|あるいは\verb|\nocite|で明示的に引用した +文献が引用順に並び,その後にそれ以外のものがデータベース中の順番で +並ぶ. + +\item +学位を授与するのは大学であり学部ではないから, +学位論文に対しては,van Leunenは学位の後に学部名を書かないことを +推奨している. +学部名を書いた方が読者が論文を見つけやすいと考えるのであれば, +学部名は{\tt address}フィールドに書くとよい. + +\item +{\tt MASTERSTHESIS}と{\tt PHDTHESIS}のエントリ形は +{\em Scribe\/}との互換性のために付けた名称であり, +{\tt MINORTHESIS}と{\tt MAJORTHESIS}の方が良い名前かも知れない. +従ってアメリカ以外での学位論文ではこのことを念頭におくこと. + +\item +ある著者の2つの著作の著者名が若干異なる場合の対処の方法. +2つの論文が次のようであったとしよう. +\begin{verbatim} + author = "Donald E. Knuth" + . . . + author = "D. E. Knuth" +\end{verbatim} +2つのやり方が考えられる. +(1)このままにする,(2)これは同一人物であるであることがはっきりと +分かっているので,著者の好みの形式(例えば,`Donald~E.\ Knuth')に統一する. +最初の方法では文献の並ぶ順番が正しくなくなるかもしれないし, +2番目の方法では名前を少し変えたことで,誰かが電子的に検索した時に +へまをやるかもしれない. +私好みの第3の方法がある. +2番目の論文のフィールドを次のように変換する. +\begin{verbatim} + author = "D[onald] E. Knuth" +\end{verbatim} +\BibTeX\ はかぎ括弧がないとしてソートするし, +かぎ括弧によって読者は完全な「名」は元の論文にはなかったと考える +から,前述の問題が解決できる. +もちろん `D[onald]~E.\ Knuth' はみっともないという別の問題が生ずるが, +私はこの場合には正確さのためには美しさを犠牲にしてよいと考える. + +\item +\LaTeX\ のコメント文字 `{\tt\%}' はデータベースファイル中では +コメント文字ではない. + +\item +前節でふれた「著者」についてもっと詳しく説明しよう. +ほとんどすべてのエントリでは「著者」は単に{\tt author}フィールドの +情報である. +しかしながら, +{\tt BOOK}と{\tt INBOOK}エントリ型では, +{\tt author}に著者がなければ{\tt editor}フィールドが使われ, +{\tt MANUAL}では, +{\tt author}に著者がなければ{\tt organization}フィールドが使われ, +{\tt PROCEEDINGS}では, +{\tt editor}に著者なければ{\tt organization}フィールドが使われる. + +\item +ラベルの作成の時に,{\tt alpha}スタイルでは上述の「著者」を使うが, +{\tt MANUAL}と{\tt PROCEEDINGS}エントリ型では +{\tt key}フィールドが{\tt organization}フィールドより優先する. +これは次のような場合に役立つ. +\begin{verbatim} + organization = "The Association for Computing Machinery", + key = "ACM" +\end{verbatim} +{\tt key}フィールドがないと{\tt alpha}スタイルは{\tt organization}フィールド +の情報から3文字のラベルを作る. +{\tt alpha}スタイルは `{\tt The}' を取り除くが,それでも +ラベルは `\hbox{[Ass86]}' となってしまい,仕組み通りではあるが,有益な +ものではない. +上のように{\tt key}フィールドを入れることで,もっとよいラベル +`\hbox{[ACM86]}' とできる. + +しかし,{\tt organization}フィールドを無効にするために +{\tt key}フィールドが常に必要なわけではない. +例えば, +\begin{verbatim} + organization = "Unilogic, Ltd.", +\end{verbatim} +としておけば,{\tt alpha}スタイルは `\hbox{[Uni86]}' といった +合理的なラベルを生成する. + +\item +第\ref{features} 節でアクセント付き文字を説明した. +\BibTeX\ にとってはアクセント付き文字は, +トップレベルの左中括弧の直後の文字がバックスラッシュである +中括弧で括られている文字列,すなわち +「特殊文字」の特別な場合にすぎない. +例えば, +\begin{verbatim} + author = "\AA{ke} {Jos{\'{e}} {\'{E}douard} G{\"o}del" +\end{verbatim} +には `\verb|{\'{E}douard}|' と `\verb|{\"o}|'の2つの特殊文字がある. +(上の例で,フィールドの区切り文字であるダブルクオートを +中括弧で置き換えたものでも同じことである). +一般に\BibTeX\ は特殊文字中の\TeX\ あるいは\LaTeX\ コマンドに対しては +何の操作もほどこさないが,そうでない場合には操作を{\dg ほどこす}. +したがって表題を小文字に変換するスタイルでは +\begin{verbatim} + The {\TeX BOOK\NOOP} Experience +\end{verbatim} +を +\begin{verbatim} + The {\TeX book\NOOP} experience +\end{verbatim} +に変換する. +(しかし,`{\tt The}' は表題の最初の単語であるので +それはそのままである). + +特殊文字はアクセント付き文字を扱うのに役立ち, +\BibTeX\ にあなたの望み通りの順番で文献を並べさせるのに役立つ. +また\BibTeX\ は特殊文字をすべてをまとめて1文字と数えるから,ラベルの中に +文字を追加するのに役立つ. +\BibTeX\ とともに配布されている{\tt XAMPL.BIB}ファイル中にすべての使い方の +例がある. + +\item +本節の最後の項目として({\tt author}, {\tt editor}フィールドの中に +記述する)名前について,\LaTeX\ bookの付録Bより少し詳しく説明する. +以下では「名前」は個人に対応するものとしよう. +(複数の著者を1つのフィールドに入れるには,中括弧に入れないで, +前後にスペースを入れて ``and'' でつなぐ. +ここでは1つの名前だけを考える). + +名前は,姓(Last),von, 名(First)とJrの4つの部分からなり, +それぞれは(空かもしれないが)文字列(トークン)のリストからなる. +空でない名前の姓は空でない,すなわち1つの文字列からなる名前 +は姓だけのものとなる\trnote{漢字コード表記された名前では,姓と名の間に +スペース(半角でも全角でも)を入れておけば,Family nameとLast-tokenから +なるものとされ,スペースがなければLast-tokenのみからなるとされる.}. + + +Per Brinch~Hansenの名前は次のようにタイプしなければならない. +\begin{verbatim} + "Brinch Hansen, Per" +\end{verbatim} +この名前の名は ``Per'' の1つのトークンからなり, +姓は ``Brinch'' と ``Hansen'' の2つのトークンからなり, +von, Jrの部分はない. +もし次のようにタイプしたとすると, +\begin{verbatim} + "Per Brinch Hansen" +\end{verbatim} +\BibTeX\ は(誤って),``John~Paul Jones'' の名トークンが ``Paul'' であるのと +同じように ``Brinch'' が名のトークンであると考え,2つの名トークンと +1つの姓トークンからなるものとする. + +もう1つ例を示そう. +\begin{verbatim} + "Charles Louis Xavier Joseph de la Vall{\'e}e Poussin" +\end{verbatim} +この名前には4つの名トークンと,2つのvonトークンと,2つの姓トークンがある. +vonパートは小文字で始まることから,\BibTeX\ は各々の部分がどこから始まり, +どこで終るかがわかる. + +一般に中括弧のレベルが0のところで小文字で始まるものはvonトークンとされる. +技術的には「特殊文字」は中括弧のレベル0であるから,\TeX\ のコマンド +文字列の大文字,小文字を保つようなダミーの特殊文字を使うことで, +\BibTeX\ がvonトークンとして扱うように/扱わないようにできる. + +まとめると,\BibTeX\ は名前の書き方として次の3つの形式を許す. +\begin{verbatim} + "First von Last" + "von Last, First" + "von Last, Jr, First" +\end{verbatim} +Jrパートがある場合,あるいは姓が複数の構成要素からなる場合以外では +一番最初の書き方を使うのが普通である. + +\item +\JBibTeX\ では漢字コード名の場合には姓と名の間にスペース(半角でも全角でも)を +置くことを標準とするが,スペースがなくても,{\tt jabbrv}スタイルなどで出力 +される名前が姓のみにならないなどの問題しか生じない.また,複数の氏名を並べる +時には \verb*| and | の代わりに,全角の句点 ``,'' あるいは ``、'' を使う +こともできる. + +\item アルファベット順でなく,五十音順にソートしたければ{\tt yomi}フィールドに +「ひらがな」で「読み」を書いておけばよい. +{\tt jplain}, {\tt jabbrv}でアルファベット表記の著者はアルファベット順に +並べ,その後に日本語著者名のものを五十音順に並べたい場合などに, +ひらがな表記の読みを使えばよい. + +ただし{\tt jalpha}スタイルではラベルをうまく作り出すには工夫が必要である. +{\tt jalpha}スタイルを使った時には,五十音順にソートすることはないであろうが, +次の例のようにすればよい. + +{\baselineskip=11pt +\begin{verbatim} + @preamble{ "\newcommand{\noop}[1]{}" } + @BOOK{sym, + editor="Janusz S. Kowalik", + title="Coupling Symbolic and Numerical Computing in Expert Systems", + publisher="North-Holland", year=1986} + @BOOK{dss, + editor="Clyde W. Holsapple and Andrew B. Whinston", + title="Decision Support Systems: Theory and Application", + publisher="North-Holland", year=1987} + @INCOLLECTION{goto, + author="後藤英一", title="計算機による数式処理とは", + yomi="{\noop{ごとう}後}藤", + crossref="reduce", pages="4--6", year=1986 } + @UNPUBLISHED{磯崎, + author="磯崎 秀樹",title="How To Use {\JLaTeX}", + yomi="{\noop{いそざき}磯}崎", + note="memo for {\JLaTeX}", year=1987} +\end{verbatim} +} + +こうしておけば,各々のラベルは[Kow86], [HW87], +[後藤86], [磯崎87]となり,アルファベット順に[HW87], [Kow86]と並んだ後に, +五十音順に[磯崎87], [後藤86]と並ぶ. +\end{enumerate} + +\bibliography{jbtxdoc} +\bibliographystyle{jplain} +\end{document} diff --git a/Master/texmf-dist/doc/ptex/pbibtex/jbtxhak.tex b/Master/texmf-dist/doc/ptex/pbibtex/jbtxhak.tex new file mode 100644 index 00000000000..0e4e4360515 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/pbibtex/jbtxhak.tex @@ -0,0 +1,691 @@ +\documentstyle{j-article} +\postkinsoku `` +\parindent=\jspaceskip +\voffset=0cm +\hoffset=-0.2cm +\textwidth=16.2cm +\textheight=25cm +\jintercharskip=0pt plus 0.5pt minus 0.5pt + +\def\JTeX{\leavevmode\lower .5ex\hbox{J}\kern-.17em\TeX} +\def\JLaTeX{\leavevmode\lower.5ex\hbox{J}\kern-.17em\LaTeX} +\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em + T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} + +\def\JBibTeX{\leavevmode\lower .5ex\hbox{{\rm J}}\kern-0.15em\BibTeX} +\def\trnote#1{\footnote{\parindent=16pt\hskip-15pt\hang\indent 訳注:#1\parindent=10pt}} + +\title{Designing B\kern-.05em{\large I}\kern-.025em{\large B}\kern-.08em\TeX\ + Styles\\ +B\kern-.05em{\large I}\kern-.025em{\large B}\kern-.08em\TeX スタイル +の作り方 +\footnote{翻訳の部分は原著者の許可を得て配布するものであり,翻訳について, +\JBibTeX に関する記述については松井に問い合わせられたい.} +$^,$\footnote{\JBibTeX (version 0.30)\cite{jbibtex}の説明も含む.} +} + +\author{Oren Patashnik(訳:松井正一)} +\date{January 31, 1988(翻訳版:1991年1月1日)} +\def\orig#1{} +\begin{document} + +\maketitle + +\setcounter{section}{4} +\section{参考文献スタイルをハックする} +\label{style} +本稿は,実際には +\BibTeX の一般的なドキュメントである``\BibTeX ing''~\cite{btxdoc}の最終節 +であり, +第\ref{style} 節からはじまる(そしてこの節だけで終る). +しかし先のドキュメントは\BibTeX の利用者向けであり,本稿はスタイル +作成者向けであるので,物理的に分離したものとなっている. +とはいえ,この文書の読者は``\BibTeX ing''に精通している必要があり,本稿で +参照している節,節番号は2つの文書が1つのものと仮定している. + +本節と標準スタイルファイルのドキュメントである{\tt btxbst.doc}で\trnote{日本 +語対応版は{\tt jbtxbst.doc}である.} +既存のスタイルファイルの修正方法,新たなスタイルファイルの作成 +方法を説明する. +もしちゃんとしたスタイルファイルを作ろうと思っているのであれば, +スタイルに関してvan~Leunen~\cite{van-leunen}に, +タイプセットに関してLamport~\cite{latex}とKnuth~\cite{texbook}に, +さらに場合によっては, +細かな互換性の問題から{\em Scribe\/}~\cite{scribe}に精通していなければ +ならない. +せっせと仕事をする合間に,Strunk and Whiteによる名小冊子 +\cite{strunk-and-white}を読むことを薦めるが,読まないのであれば, +少なくてもデータベース中のエントリと参考文献リストを見て,\BibTeX が複数の +名前をどう扱っているかを調べること\trnote{日本語対応版での漢字コード著者名の +扱い方についても調べること.}. + +新たなスタイルを作る場合には,望みのものに近い既存のスタイルを修正する +のがよい\trnote{新たなスタイルを作る時だけでなく,既存のスタイルを +修正する時でも,直接{\tt .bst}ファイルを修正するのではなく{\tt btxbst.doc, +jbtxbst.doc}を修正する方が,再利用可能性が高くなる,運が良ければ1つの修正で +複数のスタイルを修正できる,などの利点がある.}. +これは古いスタイルを\BibTeX\ version 0.99用に修正する場合にもあてはまる. +(私自身が4つの非標準スタイルを修正した経験からの忠告である). +古い(version 0.98i)スタイルのために作った関数を新しいスタイルファイルに +入れる時には,代入関数({\tt :=})の引数の順番が変更されたことに注意 +しないといけない. +スタイルファイルが完成したら,{\tt XAMPL.BIB}データベースの全てを +使って\trnote{{\tt \char"5Cnocite\{*\}}で行える.},標準エントリの全ての +型に対して望みの結果になることを確認すればよい. + +標準スタイルの虫,やりたいことができない場合にはOren Patashnikに +文句を言うこと\trnote{日本語用のものについては +松井正一{\tt (matsui@denken.or.jp)}に知らせること.}. + +\subsection{概要} + +参考文献スタイルはスタックマシンに対する命令を後置演算子形式で記述する. +標準スタイルのドキュメントを見れば,どう書くかを知るのは難しいことでは +ないが,本稿ではもっと詳しく説明する(希望があればさらに詳しくする). + +基本的にはスタイルファイルは, +名前のない言語で,プログラムを記述することにより, +どのようにしてデータベースのエントリ +から参考文献リストを作るかを\BibTeX に教えるものである(日本語対応スタイル +では\JBibTeX に教えることである.以下\BibTeX に当てはまることは\JBibTeX にも +当てはまるので,いちいちことわらない). +(以下では「エントリ」は「エントリ・リスト」のことであり,文脈から明らかな +場合には単に「リスト」とする). +このプログラム言語には,次の細節(subsection)で説明する10個のコマンドがある. +これらのコマンドは言語のオブジェクト:定数,変数,関数,スタック, +エントリ・リストを操作するものである. +(注意:この文書中の用語は説明を簡単にするために選んだものであり, +\BibTeX 本来の用語とは若干異なる.例えばこの文書中の「変数」,「関数」 +はどちらも\BibTeX にとっては関数である.\BibTeX のエラーメッセージを +解釈する時にはこのことを念頭におくこと). + +\BibTeX の関数には{\dg 組み込み}のもの(第\ref{built-in-fns}節で説明する) +と{\tt MACRO}か{\tt FUNCTION}で定義するものの2種類がある. + +スタイル作成で最も時間のかかる作業は{\tt FUNCTION}コマンドを使って +関数を作成する,あるいは既存のものを変更することである. +(実際には,前述の参考文献に精通するのに要する時間の方が長いが, +それが終った後の話しである). + +例として関数の一部を取り出したものを見てみよう. +文字列型変数{\tt label},整数型変数{\tt lab.width}があり, +{\tt label}の後ろにに`{\tt a}'を連結し,{\tt lab.width}を1増やしたいとしよう. +\begin{verbatim} + . . . + label "a" * 'label := % label := label * "a" + lab.width #1 + 'lab.width := % lab.width := lab.width + 1 + . . . +\end{verbatim} +1行目で先ず{\tt label}はその値をスタックにプッシュする. +次に {\tt "a"} が文字列定数 `{\tt a}' をスタックに置く. +続いて組み込み関数 {\tt *} がスタックトップの2つの文字列をポップし, +それらを連結したものをプッシュする. +{\tt 'label}はその変数名をプッシュする. +最後に組み込み関数 {\tt :=} が変数名と連結結果をポップし,代入を +実行する. +\BibTeX はスタイルファイル中の {\tt \%} 以降はコメントとして扱う. +2行目も同様であるが,プッシュする整数定数 +として`{\tt \#}'と`{\tt 1}'の間にスペースのない {\tt \#1} を使っている. + +スペースの数はいくつでもよく,スペース,タブ,改行はいくつあっても +1つとみなされる(後で簡単に説明するように, +コマンドの途中では改行しないほうがよい). + +文字列定数としては,ダブルクォートで囲った中には印字可能文字なら +何を書いてもよい\trnote{日本語対応版では漢字コードでもよい.}. +文字列定数に限って\BibTeX は大文字と小文字の +区別をする.さらに文字列定数の中のスペースの数は意味が{\dg ある}. +また文字列定数は行をまたがってはならない(すなわち文字列の +始めと終りのダブルクォートは同じ行になければならない). + +変数,関数の名前は数字で始まってはならず,\LaTeX~bookの143ページに +ある10個の禁止文字を含んではならないが,それ以外の印字可能文字なら +何を使ってもよい\trnote{日本語対応版では漢字コードでもよい.日本語 +プログラミングできる{\tt :-)}.}. +さらに(ASCIIコードの)大文字と小文字の区別はしない. + +変数,定数の型としては整数型と文字列型しかない +(論理値は整数の0(偽)と1(真)として実現している). +変数の種類としては3種類ある. +\begin{description} + +\item[大域変数\hfill] {\tt INTEGERS}あるいは{\tt STRINGS}コマンドで宣言 +された整数型あるいは文字列型の変数. + +\item[エントリ変数\hfill] {\tt ENTRY}コマンドで宣言 +された整数型あるいは文字列型の変数.エントリリストのエントリ毎に +別々の値を持つ(例えば{\tt label}にエントリのラベルを持たせることが +できる). + +\item[フィールド\hfill] 読みだし専用の文字列型の変数であり,データベースの +情報が格納される.値は{\tt READ}コマンドでデータベースが読み込まれる +ことで設定される. +エントリ変数同様に各々のエントリ毎に別々の値を持つ. +\end{description} + + +\subsection{コマンド} + +10個のコマンドがある. +\hbox{\tt ENTRY}, \hbox{\tt FUNCTION}, \hbox{\tt INTEGERS}, +\hbox{\tt MACRO}, \hbox{\tt STRINGS}の5個は変数の宣言, +関数の定義のためであり, +\hbox{\tt READ}はデータベースの情報を読み込み, +\hbox{\tt EXECUTE}, \hbox{\tt ITERATE}, \hbox{\tt REVERSE}, +\hbox{\tt SORT})の4個はエントリを操作し,出力を作り出す. +すべてのコマンドを大文字で示したが, +\BibTeX はコマンド名の大文字と小文字の区別をしない. + +いくつかの制限:{\tt ENTRY}と{\tt READ}の数は1つでなければらない. +{\tt ENTRY}コマンド, すべての{\tt MACRO}コマンド,{\tt FUNCTION}コマンド +のいくつか(次節{\tt call.type\$} 参照)は{\tt READ}コマンドの前に +なければならない.また{\tt READ}コマンドはエントリ操作,出力の +4つのコマンドより前になければならない. + +(本質的ではないが)コマンドの間には1つ以上のブランク行を置き, +関数定義の中にはブランク行を置かないようにするとよい. +これによって\BibTeX の構文エラーからの回復を助けることができる. + +コマンドの引数は中括弧(\verb|{ }|)に入れる. +本節で述べられていない構文に関する事項は標準ファイルのドキュメント\trnote{ +{\tt btxbst.doc, jbtxbst.doc}のこと.}を参照されたい. +以下で10個のコマンドの説明を行う. + +\begin{description} + +\item[\hbox{\tt ENTRY}\hfill] +フィールドとエントリ変数を宣言する. +3引数であり,各々の引数は(空かもしれないが)変数名のリストである. +それらはフィールド,整数型のエントリ変数,文字列型のエントリ変数である. +また\BibTeX が相互参照で使うために自動的に宣言する +{\tt crossref}フィールドと, +{\tt SORT}コマンドで使うソートキーとして{\tt sort.key\$} が,文字列型の +エントリ変数として自動的に宣言される. +以上の変数はエントリ・リストのエントリ毎に別々の値を持つ. + +\item[\hbox{\tt EXECUTE}\hfill] +関数を1つ実行する.引数は関数名1つである. + +\item[\hbox{\tt FUNCTION}\hfill] +新たな関数を定義する. +2引数であり,最初が名前で2番目が定義である. +関数は使う前に定義しなければならない.したがって再帰関数は許されない. + +\item[\hbox{\tt INTEGERS}\hfill] +整数型の大域変数を宣言する. +引数は変数名のリスト1つである. +文字列変数の長さを制限する大域的変数として{\tt entry.max\$} と +{\tt global.max\$} が自動的に宣言される. +このコマンドはスタイルファイル中にいくつあってもよいが,変数は使う前に +宣言しなければならない. + +\item[\hbox{\tt ITERATE}\hfill] +現在のリストの順番にリストのエントリに対して1つの関数を実行する +(最初はリストは引用順に並んでいるが,{\tt SORT}によって順番は変わる). +引数は関数名1つである. + +\item[\hbox{\tt MACRO}\hfill] +文字列マクロを定義する. +引数は2つで,最初が変数名,関数名と同じように扱われるマクロ名で, +次がダブルクォートで囲まれた文字列であり,その定義である. +月名の3文字の省略形とよく使われる論文誌の省略形を定義しておくこと. +この定義は利用者のデータベース中の定義で置き換えることができるから, +利用者に変更してもらいたくないものは,同じ構文の{\tt FUNCTION}を +使って定義すればよい. + +\item[\hbox{\tt READ}\hfill] +エントリ・リスト中のエントリのフィールドの値をデータベース +から探索して設定する. +引数はない. +データベース中のエントリに,対応するフィールドの値がない場合には +(必ずしもデータベース中にすべてのフィールドが書かれているわけではない) +そのフィールドの値には欠測値のマークが付く. + +\item[\hbox{\tt REVERSE}\hfill] +{\tt ITERATE}コマンドとまったく同じことをエントリリストの逆順に実行する. + +\item[\hbox{\tt SORT}\hfill] +文字列型のエントリ変数{\tt sort.key\$} を使ってエントリリストを +ソートする. +引数はない. + +\item[\hbox{\tt STRINGS}\hfill] +文字列型の大域変数を宣言する. +引数は変数名のリスト1つである. +このコマンドはスタイルファイル中にいくつあってもよいが,変数は使う前に +宣言しなければならない. +\end{description} + +\subsection{組み込み関数} +\label{built-in-fns} + +組み込み関数の説明の前に,組み込みオブジェクトついて少し説明しておく. +組み込みのエントリ文字列変数として{\tt sort.key\$} があり, +ソートを行うスタイルでは値を設定しなければならない. +組み込みのフィールドとして,第4節で述べた相互参照機能のための +{\tt crossref}がある. +さらに整数型の大域変数 +{\tt entry.max\$} と{\tt global.max\$} があり,その値は\BibTeX の内部定数 +に設定されている. +\BibTeX から警告メッセージが出ないよう, +文字列への代入の前に,代入する文字列長をこれらの値より短くして +おかねばならない. + +現在組み込み関数は37個ある\trnote{日本語対応版では,組み込み関数を1つ +追加しているので,38個ある.}. +すべての組み込み関数の名前は最後が `{\tt \$}' で終る. +以下では「1番目」,「2番目」というのはスタックからポップされた順番を意味する. +「リテラル」はスタックの要素であり,整数値,文字列,変数名, +関数名,あるいは欠測フィールドを表す特別の値のいずれかである. +ポップされたリテラルの型が誤っていると\BibTeX は文句をいった後, +関数の返す値の型に対応して,整数値の0あるいは空文字列をプッシュする. + +\begin{description} + +\item[\hbox{\tt >}\hfill] +2つの(整数)リテラルをポップし,比較を行い,2番目が1番目より大きければ1を +そうでなければ0をプッシュする. + +\item[\hbox{\tt <}\hfill] +上と同様(小さければ). + +\item[\hbox{\tt =}\hfill] +スタックトップの(ともに整数あるいは文字列の) 2つのリテラルを +ポップして比較し,等しければ1を,そうでなければ0をプッシュする. + +\item[\hbox{\tt +}\hfill] +(整数の)2つのリテラルをポップしその和をプッシュする. + +\item[\hbox{\tt -}\hfill] +(整数の)2つのリテラルをポップしその差をプッシュする. +(2番目から1番目を引く). + +\item[\hbox{\tt *}\hfill] +2つの(文字列)リテラルをポップし,それらを連結したものをプッシュする +(逆順,2番目の後に1番目を連結する). + +\item[\hbox{\tt :=}\hfill] +2つのリテラルをポップし1番目(大域変数かエントリ変数)に2番目のリテラルの +値を代入する. + +\item[\hbox{\tt add.period\$}\hfill] +スタックトップの(文字列)リテラルをポップし,`{\tt \}}' でない最後の文字が +`{\tt .}'$\!$, `{\tt ?}'$\!$, `{\tt !}'のいずれでもなければ +`{\tt .}'を最後に加えた結果をプッシュする.いずれかであれば元の文字列を +プッシュする. + +{\dg \JBibTeX での注意}: +全角の`.',`。',`?',`!'の後にも `{\tt .}' は加えない. + +\item[\hbox{\tt call.type\$}\hfill] +その名前がエントリのエントリ型の名前である関数を実行する. +例えば,エントリの型が{\tt book}であれば{\tt book}という関数が実行される. +{\tt ITERATE}コマンドの引数として指定された場合には,{\tt call.type\$} は +エントリの情報を{\tt .bbl}ファイルに出力する. +不明なエントリ型(未定義の型)に対しては{\tt default.type}を実行する. +したがって各々の標準エントリ型に対応するもの以外に{\tt default.type}という型に +対応する関数を{\tt READ}コマンドの前に定義しておかねばならない. + +\item[\hbox{\tt change.case\$}\hfill] +2つの(文字列)リテラルをポップし,1番目のリテラルの指定にしたがって, +以下に説明する形式で,2番目の文字列の大文字/小文字変換を行う +(注意:次文で「文字」とは中括弧のレベル0,最も外側の中括弧のレベルの文字の +ことであり,第4節で説明した「特殊文字」を除くそれ以外の文字は変換されない). +1番目のリテラルが`{\tt t}'であれば,文字列の1番始めの文字およびコロンの後に +スペースが1個以上続く文字列の最初の文字はそのままで,それ以外を小文字に +変換する. +1番目のリテラルが`{\tt l}'であれば,すべての文字を小文字に変換する. +1番目のリテラルが`{\tt u}'であれば,すべての文字を大文字に変換する. +そして変換結果の文字列をプッシュする. +2つのリテラルの型が文字列型でない場合には文句を言い,空文字列をプッシュする. +リテラルの型は合っているが,変換指定が上記の何れでもない場合には,文句を +付けた後,単に2番目の文字列をそのままの形でプッシュする +(もう1つの注意:変換指定文字の大文字/小文字は区別されない.すなわち +{\tt t}と{\tt T}は同じものとされる). + +\item[\hbox{\tt chr.to.int\$}\hfill] +スタックトップの(文字列)リテラルをポップし,その長さが1文字であること +を確認した後,そのASCIIコードの整数をプッシュする. + +{\dg \JBibTeX での注意}: +漢字コード文字に対応するために,リテラルが漢字コード文字の場合には +2バイトを1文字と数え,値としては1バイト目のコード値(EUCコード値)を +プッシュする.ただし +これは\JBibTeX\ version 0.10との互換性のために残したものであり,仕様変更 +される可能性が高い. + +\item[\hbox{\tt cite\$}\hfill] +エントリに対応する{\verb|\cite|}コマンドの引数の文字列をプッシュする. + +\item[\hbox{\tt duplicate\$}\hfill] +スタックトップのリテラルをポップしそのコピーを2つプッシュする. + +\item[\hbox{\tt empty\$}\hfill] +スタックトップのリテラルをポップし,それが欠測フィールドであるか,あるいは +文字列中に空白文字以外が無い場合に,整数の1をプッシュし,それ以外の場合には +0をプッシュする. + +\item[\hbox{\tt format.name\$}\hfill] +スタックトップの3つのリテラル(順に文字列,整数,文字列)をポップする. +最後の文字列リテラルが名前リスト(要素が個人名に対応)であり,整数リテラルが +リストの何番目を取り出すのかの指定であり,最初の文字列リテラルが名前を +どの様にフォーマットするのか(次節で説明する)の指定である. +フォーマットされた名前の文字列をプッシュする. + +{\dg \JBibTeX での注意}: +この関数では全角のスペースは半角のスペースと同じとみなす(より正確に +いうと全角のスペースは半角のスペースに変換されて処理される).また,全角の +句点 ``,'' と ``、'' も ``\verb*| and |'' と同様に扱うので, +漢字コード氏名は句点で区切って並べることができる. + + +\item[\hbox{\tt if\$}\hfill] +3つのリテラル(順に2つの関数リテラル,整数リテラル)をポップし, +最後のリテラル値の整数値が0より大きい時には2番目のリテラルを実行し, +そうでなければ1番目のリテラルを実行する. + +\item[\hbox{\tt int.to.chr\$}\hfill] +スタックトップの(整数)リテラルをポップし,それをASCIIコードとして, +対応する文字を1文字の文字列に変換したものをプッシュする. + +\item[\hbox{\tt int.to.str\$}\hfill] +スタックトップの(整数)リテラルをポップし,それを(一意に定まる)文字列に +変換してプッシュする. + +\item[\hbox{\tt missing\$}\hfill] +スタックトップをポップし,それが欠測フィールドであれば整数の1を,そうで +なければ0をプッシュする. + +\item[\hbox{\tt newline\$}\hfill] +出力バッファに蓄積されている情報を{\tt bbl}ファイルに書き出す. +出力バッファが空である場合に限り空行を書き出す. +{\tt write\$} は適当に改行を行なうから,空行を書き出す時,あるいは +明示的に改行したい時だけに,この関数を使うのがよい. + +\item[\hbox{\tt num.names\$}\hfill] +スタックトップの(文字列)リテラルをポップし文字列中の名前の数, +すなわち,大文字/小文字を無視して,中括弧のレベル0の位置にあり,前後が +空白文字である``and''部分文字列の数に1を加えた値, +をプッシュする. + +{\dg \JBibTeX での注意}: +この関数では全角のスペースは半角のスペースと同じとみなす(より正確に +いうと全角のスペースは半角のスペースに変換されて処理される).また,全角の +句点 ``,'' と ``、'' も ``\verb*| and |'' と同様に扱うので, +漢字コード氏名は句点で区切って並べることができる. + +\item[\hbox{\tt pop\$}\hfill] +スタックトップをポップするがプリントはしない.不必要なリテラルを +取り除くのに使う. + +\item[\hbox{\tt preamble\$}\hfill] +データベースファイルから読み込んだ{\tt @PREAMBLE}すべてを連結した文字列を +プッシュする. + +\item[\hbox{\tt purify\$}\hfill] +スタックトップの(文字列)リテラルをポップし, +空白文字,ハイフン`\verb|-|'とタイ`\verb|~|' +(これらはスペースに変換される)のいずれでもないアルファベット +以外の文字,「特殊文字」に付随した制御文字列(コマンド; control sequence)に +含まれるアルファベット文字を除去した文字列をプッシュする\trnote{漢字コード +文字列なら変化しない.}. + +\item[\hbox{\tt quote\$}\hfill] +ダブルクォート文字(`\verb|"|')1文字からなる文字列をプッシュする. + +\item[\hbox{\tt skip\$}\hfill] +何もしない. + +\item[\hbox{\tt stack\$}\hfill] +スタックの内容を全部ポップしてプリントする.スタイル作成時のデバッグ用. + +\item[\hbox{\tt substring\$}\hfill] +スタックトップの3つのリテラル(順に長さ{\it len},開始位置{\it start}の +2つの整数リテラル,文字列リテラル)をポップする. +{\it start}が正ならば文字列の先頭から数えて, +(最初が1文字目として){\it start}文字目からの, +{\it start}が負ならば文字列の終りから数えて(最後の文字が1文字目として), +$-${\it start}文字目からの, +連続する(高々){\it len}文字の部分文字列をプッシュする. + +{\dg \JBibTeX での注意}: +この関数は1文字は1バイトからなるものとして処理するので,漢字コード +文字列では指定した +文字数の半分の数の漢字コード +が得られる.また漢字コードの1文字の間で切られないように +開始位置,文字数(バイト数)の調整を行なう.調整は開始位置が漢字コードの1バイト目 +に一致していれば.開始位置はそのまま,2バイト目であれば1バイト目から取り出す +ように調整する.終了位置が漢字コードの1バイト目であれば2バイト目まで取り出す +ように調整する.したがって指定した長さより最大2バイト長い文字列となる. +これは日本語用でないスタイルファイルを使った場合でもそれなりの出力が得られる +ようにするためである. + +\item[\hbox{\tt swap\$}\hfill] +スタックトップの2つのリテラルの順序を入れ替える. + +\item[\hbox{\tt text.length\$}\hfill] +スタックトップの(文字列)リテラルをポップし, +アクセント付き文字(正確には第4節で定義されている「特殊文字」)は, +(対応する右中括弧が欠けていても), +1文字として数えた時の文字数をプッシュする. + +{\dg \JBibTeX での注意}: +漢字コード1文字は2文字と数える. + +\item[\hbox{\tt text.prefix\$}\hfill] +2つのリテラル(順に整数リテラル{\it len},文字列リテラル)をポップし, +文字列の先頭から(高々){\it len}文字の連続した文字列をプッシュする. +{\tt substring\$} に似ているが,この関数では,「特殊文字」は +対応する右中括弧が欠けていても,複数のASCII文字から構成されていても, +1文字として数える. + +{\dg \JBibTeX での注意}: +この関数では特殊文字以外の文字は,1文字は1バイトからなるものとして +処理するので,漢字コード文字列では指定した文字数の半分の数の漢字からなる +文字列が得られる. +また漢字コードの1文字の間で切られないように,終了位置が漢字コードの +1バイト目であれば2バイト目まで取り出すように調整する. +したがって指定した長さより最大1バイト長い文字列となる. +これは日本語用でないスタイルファイルを使った場合でもそれなりの出力が得られる +ようにするためである(例えば{\tt alpha}ではラベルを著者名の姓の先頭3文字 +を用いて作成するが,漢字コードの中間で終らないように2文字にしてしまうと +情報量が少なくなる,また漢字コードは特殊文字と考えて処理するとラベルが長く +なり過ぎるのでこのような仕様とした). + +\item[\hbox{\tt top\$}\hfill] +スタックトップをポップしその内容を端末とログファイル{\tt blg}にプリントする. +デバッグに役立つ. + +\item[\hbox{\tt type\$}\hfill] +現在のエントリの型({\tt book, article}など)の文字列をプッシュする. +知らない型あるいは未定義の型であれば空文字列をプッシュする. + +\item[\hbox{\tt warning\$}\hfill] +スタックトップの(文字列型)リテラルをポップし, +警告メッセージであることを示してプリントする. +また,出力した警告メッセージの数を1増やす. + +\item[\hbox{\tt while\$}\hfill] +2つの(関数)リテラルをポップし,最初の関数を実行した結果であるスタックトップ +の値が0より大きい間,2番目の関数を繰返し実行する. + +\item[\hbox{\tt width\$}\hfill] +スタックトップの(文字列型)リテラルをポップし,その印字幅をある相対単位に +基づいて計算した整数値をプッシュする +(現在は1987年6月バージョンの$cmr10$フォントに基づいて,1/100ポイントを +1として計算する\trnote{漢字コードの幅情報は正確でないので注意が必要.}). +この関数は文字列を文字通りに扱う,すなわち,(対応する右中括弧が欠けていても) +「特殊文字」は特別に扱う以外は, +たとえある文字が\TeX で特別な意味を持っていても, +文字はそのままの形でプリントされるものとして幅を計算する. +ラベル文字列の幅を比較するためのものである. + +\item[\hbox{\tt write\$}\hfill] +スタックトップの(文字列)リテラルをポップし,出力バッファに書き出す(その結果, +バッファが一杯になれば{\tt bbl}ファイルにも書き出される). + +\item[\hbox{\tt is.kanji.str\$}\hfill] +\JBibTeX のみで定義されている組込み関数であり, +スタックトップの(文字列)リテラルをポップし,文字列中に日本語文字(全角文字)が +含まれていれば(整数の)1を,そうでなければ0をプッシュする. + +\end{description} + +組込み関数{\tt while\$} と{\tt if\$} ではスタック上に2つの関数リテラルが +必要である. +これらは関数名の前にシングルクォートを付けるか, +{\tt FUNCTION}コマンドを使って関数を定義したくなければ,その定義を +({\tt FUNCTION}コマンドの2番目の引数を中括弧で囲んで)そのまま書けばよい. +例えば次に示す関数の一部分は,{\tt label}が空文字列でなければ, +その最後に文字`{\tt a}'を付け加える. + +\begin{verbatim} + . . . + label "" = + 'skip$ + { label "a" * 'label := } + if$ + . . . +\end{verbatim} + +名前をクォートする関数は,{\tt skip\$} のような組込み関数である必要はなく, +例えば,フィールドでも,自分で定義した関数でもよい. + + +\subsection{名前のフォーマット} + +名前には何が入っているのか? これについては第4節で少し詳しく説明した. +名前は「名(first)」パート, vonパート, 「姓(last)」パートとJrパートから +なり,それぞれは名前トークンのリストからなり,それぞれのパートは +空かもしれないが,名前が空でなければ姓パートは必ず空ではない. +この小節では組込み関数の{\tt format.name\$} に指定するフォーマット指定文字 +を説明する. + +例として,非常に長い名前を考えてみよう. +データベースのエントリ~\cite{prime-number-theorem}に次のフィールドが +あるとしよう. +\begin{verbatim} + author = "Charles Louis Xavier Joseph de la Vall{\'e}e Poussin" +\end{verbatim} +また「姓 カンマ イニシャル」(``last name comma initials'')の順で名前を +フォーマットしたいとしよう. +次のようなフォーマット指定文字列を使うと, +\begin{verbatim} + "{vv~}{ll}{, jj}{, f}?" +\end{verbatim} +\BibTeX はフォーマットされた文字列として次を作り出す. +\begin{verbatim} + de~la Vall{\'e}e~Poussin, C.~L. X.~J? +\end{verbatim} + +この例をもっと詳しく見てみよう. +このフォーマット指定文字列には,名前のそれぞれの構成要素に +対応する,中括弧レベルが1の4つの{\dg 断片}({\em pieces\/})がある. +対応する構成要素がなければ(この名前ではJr要素),その断片の中のすべてが +無視される. +中括弧のレベル0にあるものは(この例では,たぶんタイプミスであろうが, +`{\tt ?}'の文字は)そのままの形で出力されるが, +この機能はあまり使わないであろう. + +フォーマット指定の部分中では二重文字(double letter)は +構成要素のすべてを使うことを, +単文字(single letter)は省略形にしたものを使うことを\BibTeX に指定する. +これらの指定文字は中括弧のレベル1になければならず,それ以外の文字は( +後で説明してある文字以外のほとんどすべての文字は)そのままの形で使われる. +vonパートの最後にあるタイ(\verb|~|)は任意タイであり,\BibTeX が必要と判断 +した場合にのみ出力され,そうでなければスペースとして出力される. +本当にタイを出力したいのであれば2つ書いておけば,つまり{\verb|{vv~~}|}と +しておけば(1つだけ)出力される. +断片の最後の文字であるタイは任意タイとされるが,それ以外は通常の +文字として扱われる. + +\BibTeX は名前トークンの{\dg 間に}デフォールトの区切り文字列を書き出す. +これはスペースかタイのどちらか適した方,あるいは省略形トークンでは +ピリオドの後にスペースかタイの適した方を付けたものである. +しかしフォーマット指定の最後のトークンの後には +デフォールト区切り文字列を書き出さないから, +先の例で言えば`J'の後にはピリオドは付かない. +したがって次のように指定して, +\begin{verbatim} + "{vv~}{ll}{, jj}{, f.}" +\end{verbatim} +前の出力例の疑問符をピリオドに置き換えたフォーマット結果を得ることができる. +名前に「名」パートがない場合に対応するように,ピリオドは +疑問符の位置でなく「名」断片の中に置かねばならないことに注意しよう. + +\BibTeX のデフォールトの区切り文字を置き換えたいのなら,明示的に指定 +する必要がある. +例えばvonパートと姓パートのすべてのトークンの先頭文字を,間にスペースを +置かずに連結したラベルを作りたいのであれば, +次のように指定しなければならない. +\begin{verbatim} + "{v{}}{l{}}" +\end{verbatim} +こうすればフォーマット結果の文字列として`{\tt dlVP}'が得られる. +置き換えたいすべての部分毎に指定が必要であり(この例では両方に空文字列が +指定されている),指定は単文字,二重文字のすぐ後になければならない. +フォーマット指定文字列の中括弧のレベル1の中では, +以上で述べた文字以外を書くことはできない. + +{\dg\noindent\JBibTeX での注意点}: + +\begin{itemize} +\item 漢字コード表記された名前では,姓と名の間に +スペース(半角でも全角でも)を入れておけば,`{\tt f}'はFamily name(姓)に, +`{\tt l}'はLast-token(名)に対応することになるので,通常の +表記順に名前が書ける.しかしスタイルの作成では注意が必要である. +これは{\tt format.name\$} を完全な日本語対応版としていないからであるが, +実際に日本語対応のスタイルファイルを作成した経験からいうと,漢字コード表記 +された名前とそれ以外の名前に対して,同じフォーマット指定で +{\tt format.name\$} を呼び出すことは殆どないので,あえてこのままに +してある.しかし混乱の種かもしれない. + +\item {\tt jabbrv}で姓のみを出力できるようになどの目的で, +\JBibTeX\ ver. 0.20以降では +姓と名の間にスペース(半角でも全角でも)を置くことを標準としている. +しかしスペースがない場合にも結果がおかしくならないように,フォーマット指定 +には注意が必要である.例えば日本語スタイルの中では次のようなコーディングを +行なっている. + +{\baselineskip=11pt +\begin{verbatim} +editor is.kanji.str$ % 漢字コードの編集者? + {editor #1 "{ff}" format.name$ duplicate$ % 姓を取り出す + empty$ % 空?(姓と名の間に空白がない) + {pop$ editor #1 "{ll}" format.name$} % Last tokenを取り出す + 'skip$ % noop + if$ + } + {editor #1 "{vv~}{ll}" format.name$} % 英文編集者 +if$ +\end{verbatim} +} +\end{itemize} + +\subsection{\JBibTeX の標準スタイル} + +\JBibTeX の標準スタイルとしては{\tt plain, alpha, abbrv, unsrt}に対応して +{\tt jplain, jalpha,jabbrv,\linebreak junsrt}が作成されている. +さらに情報処理学会論文誌{\tt tipsj},情報処理学会欧文論文誌{\tt jipsj}, +電子通信学会論文誌{\tt tieic},日本オペレーションズリサーチ学会論文誌 +{\tt jorsj},人工知能学会誌{\tt jsai},ソフトウェア科学会誌{\tt jssst}用の +スタイルも作成されている.これらのスタイルで +行なっている日本語対応の主な変更は以下の通りである.詳しくは{\tt jbtxbst.doc} +を参照されたい. + +\begin{enumerate} +\item 著者名が日本語かどうかを{\tt is.kanji.str\$} を使って判定し, +名前のフォーマットの方法を変える. + +\item 著作名に日本語が含まれる場合には強調指定を付けない. + +\item ページ範囲指定を{\tt Pages}から{\tt pp.\ }に変更した. + +\item {\tt yomi}フィールドがあれば,その情報をソーティングキーを作る時に +著者名,編集者名の代りに使う. +\end{enumerate} + +\baselineskip=16pt +\bibliography{jbtxdoc} +\bibliographystyle{jalpha} +\end{document} |