diff options
Diffstat (limited to 'Master/texmf-dist/doc/ptex')
22 files changed, 9737 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/ptex/base/COPYRIGHT b/Master/texmf-dist/doc/ptex/base/COPYRIGHT new file mode 100644 index 00000000000..8127d46a033 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/COPYRIGHT @@ -0,0 +1,26 @@ +Copyright (C) 2009, 2010 ASCII MEDIA WORKS. +Copyright (C) 1987, 1995 ASCII Corporation. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Master/texmf-dist/doc/ptex/base/COPYRIGHT.txt b/Master/texmf-dist/doc/ptex/base/COPYRIGHT.txt new file mode 100644 index 00000000000..77a79ff0f89 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/COPYRIGHT.txt @@ -0,0 +1,29 @@ +(注) 以下は日本語の方が分かりやすい人のために、英語の著作権表示を訳し +た文章である。正式な著作権は、英語の原本に従う。 + +Copyright (C) 1987, 1995 ASCII Corporation. +All rights reserved. + +変更の有無にかかわらず、ソースおよびバイナリ形式の再配布および利用は、 +以下の条件を満たしていれば、これを許可する。 + +1. ソース・コードの再配布は、上記の著作権表示、この条件項目、および、 +以下の免責事項を保存しなければならない。 + +2. バイナリ形式の再配布は、上記の著作権表示、この条件項目、および、以 +下の免責事項を、その配布に付随する説明書、あるいはその他の資料のいずれ +かに明記しなければならない。 + +3. 前もって特別に許諾を得ない限り、このソフトウェアから派生した製品の +推奨や販売促進のために、この著作権者名を利用してはならない。 + +このソフトウェアは「このままの形で」提供され、明示的あるいは言外の保証 +は、商用利用および特定目的への適合に対する言外の保証も含み、またこれら +だけに限らず、存在しない。たとえ以下のような損害の可能性を示唆されてい +たとしても、どのような形にしろこのソフトウェアの利用から発生した問題に +おいて、この著作権者は、(代替製品やサービスの調達; 利用権、データ、あ +るいは利益の損失; あるいは営業の中断を含む、またこれらだけに限らず)直 +接的に、間接的に、偶然に、特別に、懲罰上、あるいは、必然的に生じてしまっ +た損害に対し責任はなく、いかなる責任理論上でも契約の有無に係わらず厳密 +な責任はなく、また(過失あるいはその他を含む)不法行為に対しても責任はな +い。 diff --git a/Master/texmf-dist/doc/ptex/base/Changes.txt b/Master/texmf-dist/doc/ptex/base/Changes.txt new file mode 100644 index 00000000000..bf36ab9b15e --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/Changes.txt @@ -0,0 +1,302 @@ +2005/10/17: (p3.1.9) + mkconf: platex の検索パスに tex/platex を入れないように修正 + ptex: 単語の先頭で LIG/ を行うようなTFMを使用するとベースラインシフト + が0でない場合に異常終了するバグを修正 + +2005/03/07: (p3.1.8) + Makefile.in: make install の最後に mktexlsr の実行を追加 + Makefile.in, INSTALL.txt: teTeX-3.0のTEXMFディレクトリの変更に伴い修正 + (ありがとうございます、角藤さん)。 + +2004/12/14: (p3.1.8) + ptex: コントロールシーケンス名の処理誤りを修正。 + (例:\Te^^5e^58 ⇒ \Te^^58 となり、\TeX として評価されない) + ptex: コントロールシーケンス直後の ^^形式が漢字として認識されて + しまう場合があるのを修正 (例:\TeX^^83A ⇒ \TeXア) + (以上、ありがとうございます、井上さん)。 + ptex: 端末やログファイルでの改行位置のタイミングの修正 + (ありがとうございます、角藤さん)。 + +2004/12/09: (p3.1.7) + ptex: ^^形式を含むコントロールシーケンス名の処理誤りを修正。 + ptex: 表示不可能文字の範囲を3.1.4と同じにした。 + (Missing character では ^^ 形式で出力)。 + mkconf: sjis,jis,eucの各エンコード名のTEXINPUTSを作成するようにした。 + また、TEXINPUTS.xetex の次に作成するようにした。 + +2004/12/02: (p3.1.6) + ptex: tetex-2.99.4.20041128-beta に対応(ありがとうございます、角藤さん)。 + INSTALL.txt: ファイル名とTDSに関するコメントを追加 + (ありがとうございます、角藤さん)。 + +2004/11/29: (p3.1.5) + ptex: コントロールシーケンス名の、^^形式の文字と次の文字を漢字と + してみなす場合があるのを修正(ありがとうございます、井上さん)。 + ptex: Missing character などのメッセージでの表示不可能文字を + ^^ 形式で出力するように修正。 + +2004/11/08: (p3.1.5) + ptex: JISエンコーディングファイルを読み込んだ後、`漢字イン' の状態が + ファイルの終わりを越えて有効になってしまう場合があるのを修正 + (ありがとうございます、井上さん)。 + +2004/10/12: + pltotf: SJISコードのPLファイルから、TFMファイルを正しく作れない + のを修正(ありがとうございます、角藤さん、青木さん)。 + +2004/09/02: (p3.1.4) + ptex: 行末記号を漢字の第1バイトに当たる文字にした場合、行の次の文字 + と共に漢字にしようとしてしまうのを修正。 + ptex: 1バイト文字のうち、漢字の第1バイトに当たる文字のカテゴリー + コードが無効な文字となってしまうのを修正。 + ptex: ^^形式で入力された文字コードが漢字の第1バイトに当たる場合、 + 次の文字と共に漢字にしようとしてしまうのを修正。 + ptex: \string で扱う文字の漢字判定を厳密化。 + jbibtex: 改行コードCRに対応。 + (以上、ありがとうございます、井上さん) + ptex: 数式内で \char を使用した場合に1バイト文字が漢字と誤認識される + バグを修正。 + (ありがとうございます、角藤さん) + 契約条文和訳を修正。 + +2003/10/07: (p3.1.3) + ptex: -kanji=sjis のとき、\kansujichar で、期待した文字が設定され + ないのを修正(ありがとう、角藤さん)。 + +2003/09/30: + ptex: 端末/ログへのメッセージで、印字できない文字が出力されることが + あるのに対処。 + +2003/08/05: + pconvert: usage メッセージの変更。pltotf, tftopl, pdvitype のとき、 + fixwrites にオプション($target)を指定するようにした。 + +2003/06/23: (p3.1.2) + configure: mktempを使わないように修正 + +2003/06/17: (p3.1.2) + Makefile.in: BSD版 make で texmf.cnf の作成に失敗しているのを修正 + +2003/02/18: (p3.1.2) + ptex: \kansuji プリミティブを復活させた。 + ptex: \kansujichar プリミティブにより、\kansuji で出力される文字を設定 + 可能にした。 + +2003/02/14: (p3.1.1) + ptex: 漢字が ^^ 形式でコンソールに表示されるのを修正。 + ptex: \uppercase, \lowercase で core を出す場合があるのを修正。 + +2003/02/13: (p3.1) + ptex: main_memory、hash_extra を大きくし、膨大なマクロ定義をすると、 + 「!Missing control sequence inserted.」のエラーになるのを修正。 + +2003/02/03: (p3.0.6) + ptex: tetex-2.0 への対応 + ptex: sjis 動作以外のとき、\char\sjis が正しく動かないのを修正 + ptex: 実験的に入れてあったプリミティブ(\kansuji、\tozen)を取り除いた + ptexextra.h: BANNER 文字列の更新 + ptexextra.c: tetex-2.0 への対応 + +2002/11/22: + Makefile.in: euc(jis), sjis 用フォーマットを作成するよう修正 + platex 用のリンクを作成するようにした + mkconf: iniptex の記述を削除 + +2002/11/15: (p3.0.5) + ptexextra.c: web2c-7.3.11 (teTeX-beta-20021114) への対応 + +2002/10/29: (p3.0.4) + --version の1行目のフォーマットを変更 + jbibtex: 認識できないオプションで core を出すのを修正 + +2002/10/28: (p3.0.3) + ptex: バナーのフォーマットを変更 + tftopl.ch: pTeX用のHELPを使っていないのを修正 + pltotf.ch: pTeX用のHELPを使っていないのを修正 + +2002/10/24: (p3.0.2) + web2c-7.3.9 に対応。 + +2002/01/18: (p3.0.1) + 以下のソースを用いたたときでもコンパイルできるようにした。 + * tetex-supp.tar.gz + * web2c-7.3.3.tar.gz + * teTeX-src-beta-20011202.tar.gz + +2002/01/15: (p3.0) + ptex-base.ch: fix hyphenation. + +2001/10/03: + README.txt: rewrite + INSTALL.txt: rewrite + ptex-base.ch: version 3.0 + ptexextra-plain.c: removed local_maintainer and this_bug_address + ptexextra-src-special.c: removed local_maintainer and this_bug_address + jbibextra.c: removed local_maintainer and this_bug_address + maintain.h: removed local_maintainer and this_bug_address + version.c: modified message + +2001/07/26: + Change Licence to modified BSD license + COPYRIGHT: new file + COPYRIGHT.jis: new file + INSTALL.txt: new file + README.txt: cut short and move to INSTALL.txt + version.c: change licence filename (l.87,91, COPYING -> COPYRIGHT) + +2001/02/13: + version.c: typo (l.89, build -> build) + ptexhelp.h: typo (l.56, versobe -> verbose) + Changes.txt: typo (20001/02/09 -> 2001/02/09) + +2001/02/09: + REAMDE.txt: rewrite for 2.1.10 + version.c: rewrite the copyright message. enable usage() function. + ptexhelp.h: newfile + help.h: removed + kanji.h.in: include "ptexhelp.h" + ptexextra-plain.c: rename TEXHELP to PTEXHELP. + ptexextra-src-special.c rename TEXHELP to PTEXHELP. + Makefile.in: depend on ptexhelp.h + +2000/11/13: (p2.1.10) +2000/11/10: + ptex.ch: can't load JFM which the number of char_type less than + the glue types. + pltotf.ch: can't convert property list which has fullwidth space + '0x2121(JIS)' in charsintype. + +2000/08/17 + mkconf: modify path separator to semicolon(;) + +2000/03/18 + README.txt: fixed web2c-7.2 -> teTeX-1.0 (l.77) + +2000/03/01 (p2.1.9) + ptexextra-plain.c, ptexextra-src-special.c: version number 2.1.8 -> 2.1.9 + +2000/02/29 (p2.1.9) + README.txt: rewrite. + +2000/02/28 (p2.1.9) + correspond to TeX 3.14159 with Web2c 7.3.1 and tex-src-special. + Makefile.in: distclean cleans tftopl.ch and pltotf.ch + ptexextra-plain.c, ptexextra-src-special.c: newfile + COPYING: newfile + +1998/04/09 (p2.1.8) +1998/03/26 (p2.1.8.beta1) + correspond to TeX 3.14159 with Web2c 7.2. + +1998/03/19 (p2.1.7) + fix bug: \leaders + +1998/02/26 (p2.1.6) + fix bug: \inhibitxspcode + +1997/08/27 (p2.1.5) + official release. + +1997/08/27 (TFtoPL v1.3) + fix bug: occers core dump when loading a JFM. + +1997/08/14 (p2.1.5, beta12) + fix bug: kinsoku process doesn't work for ligatured character. + +1997/08/07 (p2.1.5, beta11) + changed specification: How to insert \xkanjiskip at surrounding a \hbox + (back to the p2.1.4 specification). + +1997/08/01 (p2.1.5, beta10) + fix bug: caused line breaking after a kinsoku penalty by + the \jcharwidowpenalty. + +1997/07/29 (p2.1.5, beta9) + fix bug: A penalty of kinsoku doesn't work well. + fix bug: italic correction is not inserted. + +1997/07/11 (p2.1.5, beta8) + fix bug: A penalty of kinsoku doesn't work well. + fix bug: Inserted \kanjiskip before widow KANJI character when the line + holds only it (embeded 2.1.5.beta6). + fix bug: Inserted \kanjiskip between kern of head of the line and + the next widow KANJI character (since from jTeX 1.7 p1.0.9G). + changed specification: How to insert \xkanjiskip at surrounding text-math. + +1997/06/29 (p2.1.5, beta7) + fix bug: pTeX occers coredump, when \{y,t}baselineskip is not equal zero, + and where explicit kern after ligature like `diff\/'. + changed specification: How to insert \xkanjiskip at surrounding text-math. + +1997/06/16 (p2.1.5, beta6) + fix bug: The \{y,t}baselineskip isn't work except the first place in + a paragraph. + fix bug: Doesn't hyphenation when the value of \{y,t}baselineskip is + not equals zero. + fix buf: Printed `(EUC)' in banner instead of making as JIS-version. + fix bug: `make install' increase the TEXINPUTS.{ptex,platex,platex209} at + texmf.cnf. + +1997/05/13 (p2.1.5, beta5) + fix bug: Fail to read euex10.tfm. + +1997/05/01 (p2.1.5, beta4) + fix bug: \char{\jis,\euc,\sjis,\kuten} after a 1byte character that have + a possibility of ligature like the "`" causes coredump or worng result. + +1997/03/17 (p2.1.5, beta3) + change banner strings. + +1997/03/14 (p2.1.5, beta3) + fix bug: can't run as iniptex/virptex. + +1997/03/12 (p2.1.5, beta2) + fix bug: \calcpos return wrong number. + +1997/02/27 (p2.1.5, beta1) + correspond to TeX 3.14159 with Web2c 7.0. + +1995/11/21 (p2.1.4) + new feature: accept kanji filename. + +1995/11/17 (p2.1.3) + fix bug : try_break routine doesn't corect action when the list + has disp_node or dir_node (Error `disc4'). + +1995/11/07 (p2.1.2) + fix bug : \kanjiskip doesn't inserted after JFM glue/kern. + +1995/10/11 + include jbibtex (Shouichi Matsui<matsui@denken.or.jp>) and + pdvitype (Thanks, Kazunori Asayama) + +1995/09/20 (p2.1.1) + fix bug : \xkanjiskip doesn't inserted after italic correction. + fix bug : italic correction doesn't inserted when \{y,t}baselineshift + is used. + +1995/09/08 (p2.1) + fix bug : \xkanjiskip doesn't inserted after math mode which correct + italic kern spacing. + +1995/08/29 + rename `find_first' to `find_first_char' for djgpp 1.12. + (Thanks, Kazunori Asayama) + +1995/03/25 + fix bug : Three minuses sequence (---) doesn't become em-hyphen. + +1995/03/11 + imprement \kanji primitive. + +1995/01/17 + translate/modify pTeX 2.0 change file for TeX 3.1415. + +1994/12/17 + translate/modify pTeX 2.0 change file for TeX 3.141. + +1994/10/17 + translate/modify pTeX 1.0.9F change file which based on TeX 2.99 to + pTeX 2.0 which based on TeX 3.14. + +== EOF === diff --git a/Master/texmf-dist/doc/ptex/base/INSTALL.txt b/Master/texmf-dist/doc/ptex/base/INSTALL.txt new file mode 100644 index 00000000000..f20f38f3c2c --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/INSTALL.txt @@ -0,0 +1,83 @@ +=========================================================================== +日本語 TeX バージョン 3.141592, p3.1.9 +(tetex-src-3.0 以降用) +=========================================================================== +※ 必要ならば、インストール作業をする前に、 + 旧バージョンの TeX システムのバックアップをしてください。 + +※ space code を含んだファイル名がサポートされています。 + ただし、連続する二つ以上の space codes は使用しないでください: + platex "a b c d e.tex" は ok ですが + platex "a b.tex" は ng です。 + +--------------------------------------------------------------------------- +● ソースファイル +--------------------------------------------------------------------------- +pTeX をインストールするには、つぎのファイルが必要です。 + + ・ptex-src-3.1.9.tar.gz (pTeX ソースファイル) + ・ptex-texmf-2.3.tar.gz (pTeX ライブラリファイル) + ・teTeX-src-3.0.tar.gz (teTeX ソースファイル) + ・teTeX-texmf-3.0.tar.gz (teTeX ライブラリファイル) + +これらは、以下のサイトなどから入手可能です。 + +・pTeX 関連 + ftp://ftp.ascii.co.jp/pub/TeX/ascii-ptex/ + ftp://ftp.ring.gr.jp/pub/text/TeX/ascii-ptex/ + ftp://ftp.media.kyoto-u.ac.jp/TeX/ASCII-pTeX/ + ftp://bash.cc.keio.ac.jp/pub/TeX/ascii-ptex/ + ftp://ftp.cs.titech.ac.jp/pub/text/TeX/ASCII-pTeX/ + ftp://ftp.tut.ac.jp/TeX/ASCII-pTeX/ + ftp://ftp.u-aizu.ac.jp/pub/tex/ASCII-pTeX/ + ftp://ftp.foretune.co.jp/pub/TeX/ascii-ptex/ + +・teTeX 関連 + ftp://ftp.ring.gr.jp/pub/text/CTAN/systems/unix/teTeX/current/distrib/ (JPN) + ftp://cam.ctan.org/tex-archive/systems/unix/teTeX/current/distrib/ (UK) + ftp://dante.ctan.org/tex-archive/systems/unix/teTeX/current/distrib/ (GER) + ftp://tug.ctan.org/tex-archive/systems/unix/teTeX/current/distrib/ (US) + +--------------------------------------------------------------------------- +● インストール +--------------------------------------------------------------------------- +1. teTeX のライブラリファイルを展開します。 + + mkdir -p /usr/local/teTeX3/share/texmf-dist + tar zxf tetex-texmf-3.0.tar.gz \ + -C /usr/local/teTeX3/share/texmf-dist + +2. ptex のライブラリファイルを展開します。 + + mkdir -p /usr/local/teTeX3/share/texmf + tar zxf ptex-texmf-2.3.tar.gz -C /usr/local/teTeX3/share/texmf + +3. teTeX のソースファイルを展開します。 + + tar zxf tetex-src-3.0.tar.gz -C /usr/local/src + +4. ptex のソースファイルを展開します。 + + tar zxvf ptex-src-3.1.9.tar.gz \ + -C /usr/local/src/tetex-src-3.0/texk/web2c + +5. teTeX ソースファイルを展開したディレクトリに移動し、configure コマンド + を実行します。prefix オプションには、teTeX ライブラリをインストール + したディレクトリを指定します。 + + cd /usr/local/src/tetex-src-3.0 + ./configure --prefix=/usr/local/teTeX3 + make + make install + +6. ptex のソースディレクトリに移動し、configure コマンドを実行します。 + このとき、デフォルトの漢字コードを指定してください。 + + cd /usr/local/src/tetex-src-3.0/texk/web2c/ptex-src-3.1.9 + ./configure euc (EUCコードの場合) + ./configure jis (JISコードの場合) + ./configure sjis (シフトJISコードの場合) + make + make install + +=============================================================== EOT ===== diff --git a/Master/texmf-dist/doc/ptex/base/README.txt b/Master/texmf-dist/doc/ptex/base/README.txt new file mode 100644 index 00000000000..b8c2a4ba738 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/README.txt @@ -0,0 +1,32 @@ +--------------------------------------------------------------------------- +● 日本語 TeX(pTeX: publishing TeX)について +--------------------------------------------------------------------------- + + * 日本語 TeX(pTeX)は、本格的な商業出版に耐える TeX を開発する + ことを目標にしています。 + + * pTeX は、横組み専用の「日本語 TeX」に縦組み機能を追加したもの + です。日本語化のバグフィックスはすべて pTeX に対してのみ行ない、 + 横組のみの日本語 TeX に対しては行ないませんので、ご了承ください。 + + * pTeX は、WEB のチェンジファイルを使って実現されています。 + + * インストールの手順については、付属の INSTALL.txt ファイルを参照 + してください。 + + * pTeX の使用および配付に関しては、付属の COPYRIGHT ファイルを + 参照してください。 + +--------------------------------------------------------------------------- +● 問い合わせ先など +--------------------------------------------------------------------------- +pTeX についてのお問い合わせは、電子メールで www-ptex@ascii.co.jp 宛て +にお願いします。 + +pTeX の WEB ページ(http://www.ascii.co.jp/pb/ptex/)では、バグ情報や +インストールのヒント、pTeX で追加されたプリミティブ一覧などを掲載して +います。こちらもご覧ください。 + +------------------------------------- +株式会社アスキー 出版技術グループ +=============================================================== EOT ===== diff --git a/Master/texmf-dist/doc/ptex/base/jfm.tex b/Master/texmf-dist/doc/ptex/base/jfm.tex new file mode 100644 index 00000000000..9e97f594e38 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/jfm.tex @@ -0,0 +1,168 @@ +\documentclass[twoside]{jarticle} +\addtolength{\textwidth}{0.9in} +\setlength{\oddsidemargin}{.4in} +\setlength{\evensidemargin}{.4in} +\pagestyle{headings} +\begin{document} +\section{JFM file format} +%JFMファイルフォーマット +JFMファイルのフォーマットは、 +基本的にはTFMファイルのフォーマットに準拠しており、 +TFMを拡張した形になっている。 +ここでは、主にその拡張部分について説明を行い、 +その他の部分に関しては、 +\TeX\ the program等のTFMの説明を参照してもらいたい。 +\subsection{JFMファイルの構成} +JFMファイル全体の構成は、 +Table\ref{構成}(\pageref{構成}ページ)に示すとおりである。 \\ +ここでTFMと異なるのは次の点である。 +\begin{enumerate} +\item {\it char\_type}のテーブルが付け加えられたこと。 +\item {\it ligature}の換わりに{\it glue}のテーブルが設けられたこと。 +\item 2に関連して、{\it lig\_kern}から{\it glue\_kern}テーブルへ変更されたこと。 +\item これらに伴い、先頭のファイル内の各部分を規定する + パラメータ表が変更されている。 + また、オリジナルのTFMとの区別のためにidを付加している。 +\end{enumerate} + +\subsection{char\_type} +今回の\TeX の日本語化においては、同一の文字幅、 +高さ前後に挿入されるグルー等、その文字が持つ属性全てが +同じものを、1つの{\it `char\_type'}として英字フォントの1キャラクタと +同様にして扱うようにしている。 +そこで、漢字の2バイトコードとこの{\it char\_type}との対応付けを +このテーブルを使って行う。 + +このテーブルの各エントリーは1ワードで構成され、 +上位半ワードに漢字コード、下位半ワードに{\it char\_type}を持ち、 +テーブル内にはコードの値の順番に収められていなければならない。 +またこのテーブルの先頭には、デフォルトのインデックスとして +漢字コード及び{\it char\_type}の項が0のものが、 +必ず1つ存在しなければならず、このテーブルに登録されていない文字は、 +$char\_type = 0$として扱う。 +つまり、このデフォルト以外の文字幅、カーン等の属性を持つキャラクタ +のコードとタイプが2番目以降のエントリーとして存在しなければならない。 + +\subsection{char\_info} +{\it char\_type}をインデックスとしてこのテーブルを +参照することにより、各{\it char\_type}の属性を検索する。 +各テーブルへのインデックス等の情報を次の順番でパッキング +して1ワードに収めてある。 +\begin{description} +\item{width\_index(8bits)} width\_table へのインデックス +\item{height\_index(4bits)} height\_table へのインデックス +\item{depth\_index(4bits)} depth\_table へのインデックス +\item{italic\_index(6bits)} italic\_table へのインデックス +\item{tag(2bits)} + \begin{description} + \item{tag=0} {\it remainder}の項は無効であり使用しないことを示す。 + \item{tag=1} {\it glue\_kern}プログラムが{\it glue\_kern[remender]} + からに収めれれていることを示す。 + \item{tag=2、3} 使用しない。 + \end{description} +\item{remainder(8bits)} +\end{description} +% +\subsection{glue\_kern} +特定のキャラクタタイプの組み合せ時に挿入すべきglue又はkernを +簡単なプログラム言語によって指定する。 +各命令は、以下の4バイトで構成される。 +\begin{description} +\item{第1バイト} 128以上の時、このワードでプログラム終了。 +\item{第2バイト} + \begin{itemize} + \item 次の文字のキャラクタタイプが、 + このバイトで示すキャラクタタイプと同じ場合、 + 第3バイトの処理を実行し、プログラム終了。 + \item そうでなければ次のステップへ。 + \end{itemize} +\item{第3バイト} + この値によってグルーを扱うかカーンを扱うかを規定する。 + \begin{itemize} + \item 127以下の場合{\it glue[remainder$\times$3]}のグルーを挿入。 + \item 128以上の場合{\it kern[remainder]}のカーンを挿入。 + \end{itemize} +\item{第4バイト} remainder +\end{description} +\subsection{glueテーブル} +3ワードで1つのグルーを構成する。 +各値は、$design size\times2^{-20}$を単位として表す。 +\begin{description} +\item{第1ワード} width +\item{第2ワード} stretch +\item{第3ワード} shrink +\end{description} +\subsection{paramテーブル} +\begin{description} +\item{param[1]} italic slant。 +\item{param[2][3][4]} 漢字フォント間に挿入するグルーのデフォルト値。 +\item{param[5][6][7]} 漢字--英字フォント間に挿入するグルーのデフォルト値。 +\end{description} +\newpage +\begin{table}[h] +\begin{minipage}[b]{2in} +\begin{tabular}{|c|c|} \hline +\hbox to.8in{\hfil$id$\hfil} & \hbox to.8in{\hfil$nt$\hfil} \\ \hline +$lf$ & $lh$ \\ \hline +$bc$ & $ec$ \\ \hline +$nw$ & $nh$ \\ \hline +$nd$ & $ni$ \\ \hline +$nl$ & $nk$ \\ \hline +$ng$ & $np$ \\ \hline +\multicolumn{2}{|c|}{} \\ +\multicolumn{2}{|c|}{header} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{} \\ +\multicolumn{2}{|c|}{char\_type} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{char\_info} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{width} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{height} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{depth} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{italic} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{glue\_kern} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{kern} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{glue} \\ +\multicolumn{2}{|c|}{}\\ \hline +\multicolumn{2}{|c|}{}\\ +\multicolumn{2}{|c|}{patam} \\ +\multicolumn{2}{|c|}{}\\ \hline +\end{tabular} +\end{minipage} +\begin{minipage}[b]{3.3in} +\noindent +\begin{tabular}{l} +$id=$ JFM\_ID number. ($=11$) \\ +$nt=$ number of words in the character type table. \\ +$lf=$ length of the entire file, in words. \\ +$lh=$ length of the header data, in words. \\ +$bc=$ smallest character type in the font. \\ +$ec=$ largest character type in the font. \\ +$nw=$ number of words in the width table. \\ +$nh=$ number of words in the height table. \\ +$nd=$ number of words in the depth table. \\ +$ni=$ number of words in the italic correction table. \\ +$nl=$ number of words in the glue/kern table. \\ +$nk=$ number of words in the kern table. \\ +$ng=$ number of words in the glue table. \\ +$np=$ number of font parameter words. \\ +\end{tabular} +\end{minipage} +\caption{JFMファイルの構成\label{構成}} +\end{table} +\end{document} diff --git a/Master/texmf-dist/doc/ptex/base/jtex.tex b/Master/texmf-dist/doc/ptex/base/jtex.tex new file mode 100644 index 00000000000..0b3da9aabf9 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/jtex.tex @@ -0,0 +1,653 @@ +\newcommand{\cs}[1]{{$\backslash$#1}} +\documentstyle[twoside]{jarticle} +\addtolength{\textheight}{.5in} +\addtolength{\textwidth}{.7in} +\setlength{\oddsidemargin}{.4in} +\setlength{\evensidemargin}{.4in} +\title{\TeX システムの日本語化} +\author{倉沢 良一\\ASCII Corporation} +\date{昭和62年 3月} +\pagestyle{headings} +\begin{document} +\maketitle +\begin{abstract} +現在、\TeX システム の日本語化を進めているが、 +現時点で一応の動作が可能となった。 +そこで、ここにその報告と共にその内容に付いて解説する。 +ただし、ここに報告する内容については、 +決して最終的なものではなく、 +現時点での暫定的なものであることを承知してもらいたい。 +尚、本稿はこの日本語化された\TeX システムで\LaTeX を用いて作成した。 +\end{abstract} +% +\newpage +\tableofcontents +\newpage +%\listoftables +%\newpage +% +\section{\TeX システム日本語化の方針} +\TeX システムを日本語化するにあたり、次の事項に留意し +その方針を決定した。 +\begin{enumerate} +\item 完全なアッパーコンパチブルであること。 + \begin{itemize} + \item 日本語化により本来\TeX の持つ機能が損なわれるようなことが + あってはならない。 + \item 欧文、和文の区別が無く、同一のシステム(プログラム)で + 扱えること。 + 当然これまでにある、又はこれから作られる欧文の原稿が + 扱えること。 + \item 和文に対しても、欧文同様の機能が扱えること. + (フォント、マクロ等) + \end{itemize} +\item 和文特有の特殊処理が行えること。 + \begin{itemize} + \item 行頭、行末禁則を自動的に行えること。 + \item 和文、欧文間のスペーシングの調整等が自動的に行えること。 + \end{itemize} +\item 仕上がりが美しいこと。\\ + \TeX 本来の目的である``\.美\.し\.い\.出\.力''が得られなければ、 + 日本語化を行う意味は全く無くなってしまう。 + 高性能の出力デバイスと高品位のフォントを用いることにより、 + 写植機に負けない出力が得られること。 +\end{enumerate} +1.に関しては、あくまでも``\TeX システム''をそっくりそのまま +日本語環境の下で使いたいという要望である。 +和文に対しても、欧文のように自由にフォントを切り換えたり、 +マクロ定義が行いたいというのは当然であり、 +それが\TeX のような文書処理システムの魅力の1つであるからである。\\ +2.に付いては、和文を扱う場合には必然的に付いてまわる問題で、 +これらの処理が確実に行われなければ、その文書処理系の利用価値は +半減してしまうと考えられる。\\ +3.の内容は少し大げさなようにも思えるが、 +Don\nolinebreak\ Knuthの\TeX 開発の目的からすれば、至極当然のことでもある。 +又、これは 1.や2.の内容が大きく関わっているのは言うまでもないことである。 + +このような要求を、出来る限り満足するために +次のような日本語化の方策をとることにした。 +\begin{itemize} +\item 日本語化は、\TeX そのもの(initex、virtex)に対して行い、 + plainやlplain等のマクロには出来れば一切手を付けない。 + (付けたくない。) +\item ただし、追加された機能の為のイニシャライズや、パラメータの設定、 + 漢字フォントの定義等は、\TeX のフレキシビリティを保つためにもマクロで + 行えるようにする。 +\item 欧文で行えることは、可能な限り和文でも行えるようにポーティングする。 +\end{itemize} +% +\newpage +\section{\TeX 日本語化の実際} +上記の方針に基づき日本語化を行った結果、現時点で以下のように実現されている。 +% +\subsection{コード体系} +インプリメントの容易さ、現在使用しているホストマシンのコード、 +将来のパーソナルコンピュータへの移植等を考え合わせた結果、 +内部コード、外部コード共にASCII、シフトJISの組み合せを用いた。 +ただし、DVIファイル内の漢字コードだけは、JISコードを出力するようになっている。 +また半角カナのサポートは行っていない。 +% +\subsection{プリミティブ} +日本語化に伴い、幾つかのプリミティブの追加および拡張を行った。 +これらは、禁則処理、オートスペーシングおよび漢字コードのためのものである。 +この時、新しく追加するプリミティブについては、日本語独特の新しい処理に +対するものだけに止め、出来るだけ既存のプリミティブを拡張するように努めた。 +% +\subsubsection{プリミティブの追加} +\label{tbpri} +Table~\ref{tb:prim}に示すプリミティブが追加されている。 +(詳しくは、以降のセクションで解説する。) +% +\subsubsection{プリミティブの拡張} +既存のプリミティブに関しては、出来得る限り欧文、和文の区別をせずに +扱えるよう拡張を行った。 +また内部で扱うトークンに対する日本語化を行うことによって、 +プリンティングキャラクタのみでなく、マクロ名やトークンリスト +にも全角文字を半角文字と混在して扱えるようになっている。 + +\noindent 例. +\begin{quote} +\cs{char}''82A0\\ +\cs{accent}''5F`あ\\ +\cs{def}\cs{改ページ}\{\cs{eject}\} +\end{quote} +% +\begin{table}[htb] +\begin{tabular}{|l|p{4in}|} \hline +\cs{\it prebreakpenalty} & + 指定するキャラクタコードの前方に挿入するペナルティの値を設定する。 + 行頭禁則の指定として用いる。 \\ +& 例. {\tt\cs{prebreakpenalty}`、$=$1000} \\ \hline +\cs{\it postbreakpenalty} & + 指定するキャラクタコードの後方に挿入するペナルティの値を設定する。 + 行末禁則の指定として用いる。\\ +& 例. {\tt\cs{postbreakpenalty}`[$=$1000} \\ \hline +\cs{\it jis} & + 漢字コードの変換を行うためのプリミティブで、 + JISコードから内部コードであるシフトJISに変換する。\\ +& 例. {\tt\cs{prebreakpenalty}\cs{jis}"2122$=$1000} \\ \hline +\cs{\it kuten} & + \cs{jis}と同様に区点コードからシフトJISへ変換する。\\ +& 例. {\tt\cs{postbreakpenalty}\cs{kuten}"0146$=$1000} \\ \hline +\cs{\it sjis} & + 上記の2つと同様であるが、内部コードがシフトJISであるので、 + そのままの値をかえす。\\ \hline +\cs{\it kanjiskip} & + 全角コード間に自動的に挿入されるグルーを持つレジスタ。\\ +& 例. {\tt\cs{kanjiskip}$=$0pt puls .3pt minus .3pt} \\ \hline +\cs{\it xkanjiskip} & + 全角--半角コード間に自動的に挿入されるグルーを持つレジスタ。\\ +& 例. {\tt\cs{xkanjiskip}$=$2.5pt puls 1pt minus 1pt} \\ \hline +\cs{\it autospacing} & + 全角コード間へのグルーの自動挿入を行うための指定。 \\ \hline +\cs{\it noautospacing} & + 全角コード間へのグルーの自動挿入を行わないための指定。 \\ \hline +\cs{\it autoxspacing} & + 全角--半角コード間へのグルーの自動挿入を行うための指定。\\ \hline +\cs{\it noautoxspacing} & + 全角--半角コード間へのグルーの自動挿入を行わないための指定。\\ \hline +\cs{\it xspcode} & + 全角--半角コード間へのグルーの自動挿入の対象となる + 半角コードを指定する。 + 現在デフォルトの値としてアルファベットおよび数字に対して + スペースが挿入されるように設定されている。 \\ +& 例. {\tt\cs{xspcode}`A$=$0} \\ \hline +\end{tabular} +\caption{日本語化に伴い追加されたプリミティブ。} +\label{tb:prim} +\end{table} +% +\subsection{ラインブレーク} +欧文と和文の処理で見かけ上最も大きな違いは、ラインブレーク処理であると思われる。 +``見かけ上''と言うのは、\TeX 内部の処理には +さほど大きな変更はいらないからである。 +具体的には、次のように文中のどの位置を +ブレークポイントの対象とするかの問題である。 +\begin{itemize} +\item 欧文中でのラインブレークは、ハイフネーション処理等の特別な場合を除いて、 +単語中つまり連続する文字列中は、ブレーキングポイントして選択されない。 +\item 和文中では禁則の例外を除いて、 +全ての文字間がブレークポイントの対象になり得る。 +\end{itemize} +実際に\TeX 内部ではパラグラフ単位でラインブレークの処理が行われ、 +それは{\it line\_break}というルーチン内で、 +ブレーク可能な箇所を捜し出し、それを{\it try\_break} +という関数に渡すことにより行われている。 +(勿論こんな単純なものではないが、基本的な操作としてこうした形になっている。 +詳しくは、\TeX: The Program PART38、39 Breaking paragraphs into lines. +を是非読んでみることをお勧めする。) +そこで、和文中の文字間もブレークポイントの候補として、 +{\it try\_break}に渡すよう変更した。 + +又、本来ならばラインブレークの処理は、次項の禁則処理と密接な関係があり +とても分けて考えられるものではない。 +しかしながら、\TeX では事実上完全に分けて考えても差し支えがないような +構造になっている。 +それは、ペナルティと呼ばれるブレーキングのための +一般的な評価値が導入されているためであり、 +ブレーキングルーチンではこの値を如何に評価するか +だけを考えれば良く、 +禁則処理ルーチンでは、この値を如何に設定するかだけを考えれば良い。 +% +\subsection{禁則処理} +% +\subsubsection{禁則処理でのペナルティの応用} +前のセクションでも簡単に触れたように、 +禁則処理も\TeX にとって全く新しい概念ではなく、 +ペナルティと言う形で導入されている。 +これは、上記のラインブレークやページブレーク処理時に、 +その箇所がブレークポイントとして、 +どの程度適切(負値のペナルティ)であるかあるいは +不適切(正値のペナルティ)であるかを示すための評価値である。 +したがって、ただ単にその箇所でのブレーキングを禁止するだけでは無く、 +強制的なブレーキングや、禁則文字が連続するような場合の +優先順位付けにも利用できる。 + +日本語の禁則処理にこのペナルティを応用するためには次のようにすればよい。 +\begin{list}{}{\setlength{\leftmargin}{2cm}} +\item[行頭禁則] 禁則文字の前に正のペナルティを付ける。 +\item[行末禁則] 禁則文字の後ろに正のペナルティを付ける。 +\end{list} +こうした形でペナルティを自動的に挿入さえできれば、 +後は既存の\TeX のルーチンをそのまま利用できるはずである。 +% +\subsubsection{禁則テーブル} +このペナルティを自動的に挿入するために、 +\TeX 内部に禁則文字とその文字に対応するペナルティ値と +ペナルティの挿入位置(その文字の前に挿入するか後に挿入するかの別) +のテーブルを持つことにした。 +そしてこのテーブルにこれらの情報を登録する手段として、 +{\bf\cs{pre\-break\-penalty}}と{\bf\cs{post\-break\-penalty}} +の2つのプリミティブを追加した。 +{\bf\cs{pre\-break\-penalty}}は +指定した文字の直前にペナルティを挿入することを、 +{\bf\cs{post\-break\-penalty}}は +指定した文字の直後にペナルティを挿入することを指定するもので、 +全角文字、半角文字の区別無しに指定できる。 +これらは、同一の文字に対して同時に両方のペナルティを挿入するようには +指定できない。 もし同一の文字に対して双方の指定がされた場合、 +後からのものに置き換えられる。 +勿論これらは``\{\}''による、グルーピング規則が適用される。 +又、双方で指定できる文字数は最大で256文字までである。 +この値は、全角文字、半角文字を合わせて禁則対象となると考えられる +文字数を、十分にカバーしていると思われる。 + +この禁則テーブルからの登録の削除は、 +ペナルティ値`0'を設定することによって行われるが、 +グローバルレベルでの設定でなければ、 +このテーブルの領域は解放されないことに注意して欲しい。 +なぜなら、ローカルレベルで領域を解放してしまえば、 +その外側のレベルに戻ったときに、そのレベルでの値を +最設定するための領域が確保されている保証がないからである。 + +このテーブルができれば、各文字を読み込む度に、 +その文字がこのテーブルに登録されているかどうかを調べ、 +登録されていればそのペナルティを文字の前後適切な位置に挿入して行けば良い。 +この禁則テーブルの検索にはハッシュ法を用いており、 +ハッシュ関数として +\label{`ハッシュ関数'} +\[\left\{ \begin{array}{cl} + (C2+(C2<<(C1-0x81)))\,mod 256 & 漢字コード\\ + & C1=上位バイト、C2=下位バイト\\ + \\ + C*2+1 & ASCIIコード + \end{array} +\right. \] +を用いている。 +これは、おそらく禁則の対象となるであろう、 +全角の記号、ひらがなカタカナの小文字、ASCIIコードの記号等 +を適当に散らばらせるように考えてある。 +又、このテーブルには最大256文字まで登録可能であるが、 +むやみに多くの文字を登録してテーブルを満たすことは、 +禁則文字検索のオーバーヘッドを大きくし、 +パフォーマンスに大きな影響を与えるので注意する必要がある。 + +こうしてペナルティを適切に挿入さえしてしまえば、 +後は\TeX のラインブレークルーチンに\. お\. ま\. か\. せしてしまえる。 +勿論、このテーブルにいかにペナルティを登録するかは、 +ユーザーの責任であると共に、ペナルティ値の変更により自由に +禁則処理に変化をつけることができる。 +% +\subsection{スペーシング} +{\noautospacing\noautoxspacing +これまでの変更で一通りの和文を出力することは可能である。 +ところがこれだけではまだ不十分で、 +このままでは決して\. 美\. し\. い出力は得られない。 +なぜなら、欧文では単語毎にスペースが挿入され、 +そこでのスペーシング量を調整することにより、 +ジャスティファイケーションの処理が行われていた。 +ところが、これまでの変更だけでは、 +和文に対してそのような調整を行う部分がほとんど無いのである。 +この状態がいったいどのようなものであるか +試しに、この段落を上記の{\it\cs{noautospacing\/}}と +{\it\cs{noautoxspacing\/}}によって、スペーシングの自動挿入を +しないで組んでみた。 +この操作にによって、この段落中にとられるスペースは +ピリオド、カンマの後のスペースのみである。\par} + +%\autospacing\autoxspacing +一目して解るように、行末に1文字以上の不揃いが出来てしっまている。 +これは、パラグラフ全体をダイナミックにブレーキングするといった、 +\TeX の長所が悪い方に働いてしまい、 +数行先の禁則処理の影響がそのまま反映されているのである。 +禁則ペナルティのパラメータの値の悪さも手伝ってか、 +悲惨な結果となってしまっている。 +% +\subsubsection{和文組版におけるスペーシング} +これに対して一般に行われている和文の組版では、 +行単位のみでのブレーキングが行われており、 +最悪の場合でもこのようなことは起こらないようである。 +また組み幅は、全角の正数倍にとられるため日本語のみの +行では必ず行末がきれいに揃う仕掛になっている。 +だだし、禁則が生じたり、途中に欧文が挿入されたりした場合は、 +やはりどこかで調整が必要になってくる。 +こうした調整は次のような箇所で行われているようである。 +\begin{itemize} +\item まずこうした調整に迫られた場合、追込みを考える。 + 追込みのために、カンマ、ピリオド、括弧等の文字を + 半角幅にまで縮めてみる。 +\item それでも調整しきれず、行中に欧文が存在する場合は、 + 欧文間、和文--欧文間のスペースを調整する。 +\item さらに調整が必要な場合は、かな文字間のスペースを + 調整する。 +\item これでもまだ駄目な場合、追い出しを試みる。 +\end{itemize} +説明が遅れてしまったが、和文--欧文間には見栄えを良くするために、 +4分開けと呼ばれる全角幅の$1/4$のスペースが挿入される。 +実際問題としては、禁則文字が連続でもしない限り、 +行中に2つ以上のカンマ、ピリオドの類の文字が存在すれば、 +最初の段階で調整は付いてしまう。 + +\subsubsection{\TeX でのスペーシング} +これを\TeX に応用することを考えてみる。 + +まず組み幅の問題であるが、\TeX の場合、何文字幅といった +指定も簡単に実現可能ではあるが、既存のマクロ等の利用を考えると +組み幅ばかりでなく、インデント等の組み幅に関係する全てのパラメータ +も同時に変更する必要があり、出来れば自由な組み幅の指定が出来た方が良い。 +そうなると、ピリオド、カンマ等の文字が一文字も表れないような行に対しても +組み幅を調整する手段が新たに必要となる。 +しかも、行中にそう何文字も表れないような文字に、 +こうした帳尻合わせを集中するのは、あまり\. 美\. し\. いことではない。 + +次に、和文--欧文間のスペース等は原稿中でいちいち気にしながら +挿入するのでは非常に面倒である。 こうした類のものは +折角コンピュータを使用しているのであるから、 +自動的に行ってほしい。 + +このような要求を満たすために次のような変更を加えることにした。 +\begin{enumerate} +\item 全角文字間にもグルーを自動的に挿入できるようにする。 + これによりピリオド、カンマ等の文字が表れない行でも + ジャスティファイケーションが行える。 + またカンマ等の持つスペースだけでなく、行全体で + その調整分を分割するため、より自然な組みが実現できる。 + 勿論、ここで行う調整は0.数ptといった極めて微量の調整である。 + さらにこのグルーの導入により、1歯詰めなどといった組み方も + 可能になる。 +\item 和文--欧文間のスペーシングは当然\TeX が自動的に行って + くれるものだと考え、そのまま導入した。 + ただし、全ての和文--欧文間(全角文字--半角文字間) + に挿入して良いわけではない。 + 例えば、半角のピリオド、カンマ、括弧類記号と + 全角文字間には余計なスペースは入れない方がよい。 +\item オリジナルの\TeX では、改行キャラクタを読み込むことにより + 単語の切れ目と判断し、スペースが挿入される。 + しかし、和文ではこうしたスペースを挿入されるのは + 不都合である。 そこで全角文字の後の改行は + ただ単に読み飛ばすだけの処理に変更する必要がある。 +\end{enumerate} + +1.の実現方法として、{\bf\cs{kanjiskip}}というグルーレジスタを +新たに設け、このグルーを全角文字間に挿入するようにした。 +ただし、実際に他のグルーと同じように処理したのでは、 +全角文字1文字に付き1グルー分のメモリを消費することになり、 +余りにもメモリ効率が悪くなる。 そこでこのグルーに関しては、 +ラインブレークや、ボックスへの組み込みルーチン({\it hpack}) +内での組み幅の計算だけで処理するようにしてある。 + +2.に関しては、\TeX が数式中で行っているように、必要な箇所に +実際にグルーを挿入する。 挿入するグルーは、 +1.と同じように{\bf\cs{kanjixskip}}というレジスタを +設け、その値を使う。 +さらに、全角文字の前後に現れる半角文字の内の何れに対して、 +スペースを挿入すべきかを指定するために、 +内部に128文字分のテーブルを設け、そこに登録されている +内容によってスペース挿入の有無を決定している。 +現在デフォルトでアルファベットおよび数字がスペース挿入の +対象となっている。 このテーブルへの登録は、{\bf\cs{xspcode}}という +プリミティブによって行う。 +各ASCIIキャラクタに対して0を設定することにより、 +全角との間のスペースの挿入を禁止し、それ以外の値で許可するようになっている。 + +尚、1.2.に共通する処理として、これらのレジスタの値は、 +そのパラグラフ、あるいは{\it hbox}に入った時点での値を保持して +使用し、その中でどんなに変更を加えても処理には影響が及ばない +ようになっている。 +又、これらの処理は、{\bf\cs{auto\-spacing}}、{\bf\cs{no\-auto\-spacing}}、 +{\bf\cs{auto\-xspacing}}、{\bf\cs{no\-auto\-xspacing}}によって +ON、OFFできるようになっている。 + +3.は\TeX のスキャンニングルーチンを変更することで、 +スペーシングキャラクタとして、先のルーチンに渡って行かないようにした。 +% +\subsection{フォント} +フォントに関しても、できるだけ欧文のものと同じ扱いが出来るように +配慮した。 +\subsubsection{\TeX での日本語フォントの取り扱い} +ユーザインタフェースからみた日本語フォントの取り扱いは、 +{\it\cs{mathcode}}等の数式関係のフォントの定義中には +含めることができないことを除くとほとんど同じようにして扱える。 +異なる点は、半角文字と全角文字とを使い分ける度に +フォントの切り換えを行うのは非常に繁雑なので、 +カレントフォントとしてこれまでの半角文字用の他に +全角文字用も独立して持つようにしたことである。 +これによって特にフォントの変更を行う必要がなければ、 +全角、半角の区別を意識することなしに原稿を入力することが出来る。 +具体的には次のように指定すれば良い。 +\begin{quote} +\tt \cs{font}\cs{jfont}=min10\\ +\cs{jfont} +\end{quote} +これを見てわかるように、これまでと全く同じようにして指定できる。 +この時指定された\cs{jfont}が漢字フォントであれば、 +漢字用のカレントフォントを変更する。 +漢字フォントと英字フォントの判別は、TFMファイルにより行っている。 + +又、数式中でのフォントを指定する、ファミリーに付いても +同様に、全角用のカレントファミリーを拡張した。 +これにより、全角文字に対しても、上付き文字や下付き文字の取り扱いが +可能になる。 +勿論、半角、全角を意識する必要はない。 +ただ全角用カレントファミリーが半角用と異なる点は、 +半角用のカレントファミリーは、マスモードに +切り替わった時点で-1にセットされるのに対し、 +全角用のカレントファミリーは、そのままの値を保つことである。 +(マスモード中でのフォント切り換えのメカニズムに付いては、 +\TeX book p.154等を参照のこと。) +これは、数式関係のフォント定義を日本語フォントにまで +拡張していないための措置であるが、 +数式用フォントに関しては、全角文字に拡張してもほとんど +意味がないので、こうした形をとった。 +% +\subsection{TFMファイルとcharノード} +\TeX 内部では印字データをcharノードと呼ばれるノード中に +そのフォントの種類と共に格納する。 +又、\TeX システムには、TFMファイルと呼ばれるファイルがフォントの種類毎に +用意されており、 +そこに各フォント内に含まれるキャラクタの、各種サイズ等の情報が置かれている。 + +\TeX のラインブレーク等の処理は、このcharノード中のキャラクタデータから +TFMファイルの字幅情報等を検索して処理する仕組みになっている。 +したがって、\TeX を日本語化する際には、これらをどのように +拡張し、どのように対応付けるかがキーポイントとなる。 +% +\subsubsection{TFMファイルの拡張} +まずTFMファイルであるが、この中には{\it char\_info}と呼ばれる +そのフォント中に存在するキャラクタのコードと1対1に対応するテーブルが +置かれている。 +このテーブル中には{\it width\/、height\/、depth}等の他のテーブルへの +インデックスが設定されており、このインデックスを用いて +それぞれのパラメータを参照する仕組みになっている。 + +ただし、このインデックスのサイズから、 +1フォント内に含まれるキャラクタのサイズの種類が制限されてしまっている。 +しかし、漢字フォントは1フォント内の数は多いが、そのサイズは記号等を +除いてほとんど同じであり、この制約内に十分に収まると判断した。 +そこでこの{\it char\_info}とその他のテーブルの仕組みは、 +そのまま利用することにし、{\it char\_info}テーブルと漢字の2バイトコードを、 +対応付けるための方策を考えることにした。 + +その手段として漢字コードと{\it char\_info}へのインデックスを持つテーブルを +付け加えることにした。 +ところが、漢字フォントは1フォント中に約7000文字もの数があり、 +そのままテーブルに持つのは得策ではない。 +この解決策として、1フォント内のキャラクタの大部分が同じサイズを持つという +漢字の特徴から、デフォルトサイズを規定し、これと異なるものだけを、 +そのコードと{\it char\_info}へのインデックスの対という形で +テーブルを持つようにした。 +さらに、検索のオーバヘッドを軽減するために、 +テーブルを漢字コード順にソーティングした形で持つように規定した。 + +又、従来のTFMファイルと区別するためにサフィックスを``{\bf JFM}'' +と変更した。 +% +\subsubsection{charノードとJFMファイルの対応付け} +charノードは、上記したとおりそこにフォントとキャラクタコードを +持ち、さらに次のノードへのポインタを含んでいる。 +これを日本語のために拡張するためには、ノードサイズを変更するか、 +複数のノードによって1つのキャラクタを表現するかの2通りが +考えられる。 +処理の効率から考えると、前者の方がより良いのであるが、 +そのためには\TeX のメモリ管理ルーチンの大変更をしなければ +ならず、今回は断念した。 + +ここで採用した方法は、\TeX : The program にも簡単に書かれていたとおり、 +連続する2つのcharノードを使って日本語1文字を表すものである。 +具体的には、2つ目のノードにキャラクタコードを格納し、 +1つ目のノードには、フォントとTFMの{\it char\_info}への +インデックスを格納するようにしてある。 +つまり、charノードを生成する段階で、TFMファイルに拡張したテーブルから、 +{\it char\_info}へのインデックスを検索してしまうのである。 +こうすることにより、この1つ目のcharノードは、 +既存の欧文キャラクタのcharノードと全く同一に扱える。 +2つ目のノードは、最後にDVIファイルに出力する時や、 +エラーが生じた場合に必要になるだけで、 +一般の内部処理では読み飛ばしてやりさえすれば良い。 + +あるcharノードが日本語用のものであるかどうかは、 +charノード内のフォントを調べ、それが漢字フォントであるかどうかによって +判断する。 +この処理を簡単に能率良く行うために、 +フォントが漢字かどうかのテーブルを\TeX 内部に設けてある。 +% +\subsection{数式中での日本語の使用} +フォントの項でも簡単に触れたとおり、 +数式中においても日本語が扱えるように変更を行ってある。 +これは、数式中に直接日本語が含まれるような +使い方は希であるが、 +\ref{`ハッシュ関数'}中の式のように、 +簡単な説明等を付け加えたいことは良くあるからである。 +% +\newpage +\section{今後の予定} +現時点までの\TeX の日本語の状態を一通り表面的な部分のみで +あるが解説してみた。 +勿論、まだ不十分な点は多々あるが、 +実際にこの原稿を作ってみて、十分使用に耐えることは確信できた。 +特に\LaTeX がそのまま日本語で使用できることは、 +感激に価する。 +今のところ、\LaTeX のコマンドで使用できないものは無いようである。 + +今後の予定として次のようなことを考えている。 +\begin{itemize} +\item 自動的に挿入される、全角間および全角--半角間のスペースは、 + {\bf\cs{kanji\-skip}}、{\bf\cs{xkanji\-skip}}の値が必ず + 使われてしまうが、これはJFMファイル中に、デフォルト値を + 設定出来るようにして、フォントの変更と共に最適値を + 使用できるようにしたい。 +\item 全角の記号等は、全角幅固定ではなく、基本的にはその文字の持つ + 実際の幅で取り扱えなければ、行頭や行末におかれる場合、 + 行ぞろえが正確に行えず\. 美\. し\. く\. な\. い。 + こうした記号類は漢字フォントであっても、 + 独自の字幅情報を持つようにしたい。 +\item 全角文字に対しても、文字の組み合せによるカーニングを + 行うべきである。 特にひらがなカタカナの後に、ピリオド、 + カンマの類の文字が続いた場合の、 + スペースの空き方が不自然なことが場合があり、 + 調整できるようにする必要がある。 +\end{itemize} +% +%\appendix{TFMファイルの構造} +%\begin{tabular}{|cp{2in}|} \hline +%lf & lh \\ \hline +%bc & ec \\ \hline +%nw & nh \\ \hline +%nd & ni \\ \hline +%nl & nk \\ \hline +%ne & np \\ \hline +%\multicolumn{2}{|c|}{} \\ hline +\newpage +\appendix +\section{禁則ペナルティの設定例} +禁則ペナルティの設定例として、 +このテキスト制作時に使用した設定を上げておく。 + +\vspace{15pt} +{\tt\noindent +\begin{tabular}{lll} +%半角文字 +\cs{prebreakpenalty}`.=1000 & +\cs{prebreakpenalty}`,=1000 & +\cs{prebreakpenalty}`\}=1000 \\ +\cs{postbreakpenalt}y`\{=1000 & +\cs{prebreakpenalty}`)=1000 & +\cs{postbreakpenalty}`(=1000 \\ +\cs{prebreakpenalty}`]=1000 & +\cs{postbreakpenalty}`[=1000 & +\cs{postbreakpenalty}`!=500 \\ +\cs{postbreakpenalty}`\#=500 & +\cs{postbreakpenalty}`\$=500 & +\cs{postbreakpenalty}`\%=500 \\ +\cs{postbreakpenalty}`\&=500 & +\cs{postbreakpenalty}`\`=500 & +\cs{prebreakpenalty}`|=500 \\ +\cs{prebreakpenalty}`;=500 & +\cs{prebreakpenalty}`?=500 & +\cs{prebreakpenalty}`:=500 \\ +%全角文字 +\cs{prebreakpenalty}`、=1000 & +\cs{prebreakpenalty}`。=1000 & +\cs{prebreakpenalty}`,=1000 \\ +\cs{prebreakpenalty}`.=1000 & +\cs{prebreakpenalty}`・=1000 & +\cs{prebreakpenalty}`:=500 \\ +\cs{prebreakpenalty}`;=500 & +\cs{prebreakpenalty}`?=500 & +\cs{prebreakpenalty}`!=500 \\ +\cs{prebreakpenalty}`)=800 & +\cs{postbreakpenalty}`(=800 & +\cs{prebreakpenalty}`}=800 \\ +\cs{postbreakpenalty}`{=800 & +\cs{prebreakpenalty}`[=800 & +\cs{postbreakpenalty}`]=800 \\ +\cs{postbreakpenalty}`‘=1000 & +\cs{prebreakpenalty}`’=1000 & +\cs{prebreakpenalty}`ー=200 \\ +\cs{prebreakpenalty}`+=200 & +\cs{prebreakpenalty}`−=200 & +\cs{prebreakpenalty}`==200 \\ +\cs{postbreakpenalty}`#=200 & +\cs{postbreakpenalty}`$=200 & +\cs{postbreakpenalty}`%=200 \\ +\cs{postbreakpenalty}`&=200 & +\cs{prebreakpenalty}`ぁ=150 & +\cs{prebreakpenalty}`ぃ=150 \\ +\cs{prebreakpenalty}`ぅ=150 & +\cs{prebreakpenalty}`ぇ=150 & +\cs{prebreakpenalty}`ぉ=150 \\ +\cs{prebreakpenalty}`っ=150 & +\cs{prebreakpenalty}`ゃ=150 & +\cs{prebreakpenalty}`ゅ=150 \\ +\cs{prebreakpenalty}`ょ=150 & +\cs{prebreakpenalty}`ァ=150 & +\cs{prebreakpenalty}`ィ=150 \\ +\cs{prebreakpenalty}`ゥ=150 & +\cs{prebreakpenalty}`ェ=150 & +\cs{prebreakpenalty}`ォ=150 \\ +\cs{prebreakpenalty}`ッ=150 & +\cs{prebreakpenalty}`ャ=150 & +\cs{prebreakpenalty}`ュ=150 \\ +\cs{prebreakpenalty}`ョ=150 \\ +\end{tabular} +\begin{tabular}{ll} +\cs{prebreakpenalty}\cs{jis}"212B=1000 & +\cs{prebreakpenalty}\cs{jis}"212C=1000 \\ +\cs{prebreakpenalty}\cs{jis}"212D=1000 & +\cs{postbreakpenalty}\cs{jis}"212E=1000 \\ +\cs{prebreakpenalty}\cs{jis}"2139=250 & +\cs{prebreakpenalty}\cs{jis}"2144=250 \\ +\cs{prebreakpenalty}\cs{jis}"2145=250 & +\cs{postbreakpenalty}\cs{jis}"2146=1000 \\ +\cs{prebreakpenalty}\cs{jis}"2147=1000 & +\cs{postbreakpenalty}\cs{jis}"2148=1000 \\ +\cs{prebreakpenalty}\cs{jis}"2149=1000 & +\cs{postbreakpenalty}\cs{jis}"214C=800 \\ +\cs{prebreakpenalty}\cs{jis}"214D=800 & +\cs{postbreakpenalty}\cs{jis}"2152=800 \\ +\cs{prebreakpenalty}\cs{jis}"2153=800 & +\cs{postbreakpenalty}\cs{jis}"2154=800 \\ +\cs{prebreakpenalty}\cs{jis}"2155=800 & +\cs{postbreakpenalty}\cs{jis}"2156=800 \\ +\cs{prebreakpenalty}\cs{jis}"2157=800 & +\cs{postbreakpenalty}\cs{jis}"2158=800 \\ +\cs{prebreakpenalty}\cs{jis}"2159=800 & +\cs{postbreakpenalty}\cs{jis}"215A=800 \\ +\cs{prebreakpenalty}\cs{jis}"215B=800 & +\cs{prebreakpenalty}\cs{jis}"246E=150 \\ +\cs{prebreakpenalty}\cs{jis}"256E=150 & +\cs{prebreakpenalty}\cs{jis}"2575=150 \\ +\cs{prebreakpenalty}\cs{jis}"2576=150 \\ +\end{tabular}} + +\end{document} diff --git a/Master/texmf-dist/doc/ptex/base/jtexdoc.tex b/Master/texmf-dist/doc/ptex/base/jtexdoc.tex new file mode 100644 index 00000000000..e6bea93d3dd --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/jtexdoc.tex @@ -0,0 +1,403 @@ +\def\cs#1{$\backslash$\kern0pt#1} +\def\angle#1{$\langle$\kern0pt#1\kern0pt$\rangle$} +\documentstyle{jarticle} +\begin{document} +\title{日本語\TeX} +\author{倉沢 良一\\ASCII Corporation} +\date{昭和62年8月 \\ 昭和62年12月 \\ 平成元年10月} +\maketitle +\begin{abstract} +これは、日本語\TeX の使い方の注意点と、 +\TeX の日本語化にともない変更あるいは追加された機能について +解説したドキュメントです。 +基本的な\TeX の使い方については、\TeX bookや +\LaTeX: A document Preparation System. をご覧ください。 +\end{abstract} + +\section{日本語\TeX の概要} +日本語\TeX は、オリジナルの\TeX と完全なアッパーコンパチブルを保っています。 +ですから、これまで欧文で作られたファイルはそのまま日本語\TeX に +かけられるはずです。 +現在のバージョンで扱える漢字コードは、シフトJISおよびEUCです。 +ただし、これらはソースファイルにパッチをあてて、makeし直さなければなりません。 + +日本語(2バイトコードキャラクタ)のハンドリングに関しては、 +でき得る限り英字(1バイトコードキャラクタ)と同じように取り扱える +ようにしてあります。 +したがって、特殊な使い方をしない限り英字と同じようにして、 +原稿ファイルを作成していくことができます。 + +しかも、カレントフォントとして英字と漢字とを別々に持っているため、 +英字と漢字の切り換えは特に気にする必要はなく、 +そのまま混在して使うことができます。 + +和文と欧文の処理の違いとしてラインブレークのタイミングと +それに関係する禁則処理、さらに和文欧文が混在した場合のスペーシング +の処理などがあります。 +日本語\TeX では、これらの処理を自動的に行っていますが、 +柔軟性を高めるために、こうした処理に関係するパラメータを自由に再設定 +できるようになっています。 + +フォントに関しては、1フォントでJISコードの第1水準、第2水準全てを +扱えるように拡張してありますから、英字フォントと同じように漢字フォントを扱え、 +JFM(TFM)ファイルをつくることにより、自由に使用可能なフォントを増やして +いくことができます。 + +DVIファイルは、SET2 および PUT2 を使って2バイトコードを出力しているため、 +これまでのものとの互換性は保たれています。 +またDVIファイルには、JISコードを用いて出力しています。 + +\section{原稿を書く上での注意点} +基本的には、欧文と和文は全く同じようにして扱えます。 +ただし、日本語特有の処理機能を持たせているため、 +原稿を書くうえでは次のことに注意してください。 +\begin{itemize} +\item コントロールシーケンスにも2バイトコードキャラクタ + が使えるようになっています。 + したがって、コントロールシーケンスに続けて2バイトコードの + 文字を書き並べる場合は、必ず半角スペースやタブ等で間を区切ってください。 +\item 欧文の場合、改行は単語間のスペースとして取り扱われますが、 + 日本語の場合、原稿内では自由な箇所で改行が行えたほうが便利です。\\ + そこで日本語\TeX では、1行の終わりが1バイトコードの場合はスペーサー + の挿入を行い、2バイトコードの場合は何も行わないようになっています。 +\item 2バイトコードキャラクタと1バイトコードキャラクタが + 連続する場合、自動的に\cs{xkanjiskip}に設定されてているグルーを + 挿入します。ただしこの処理は、どの1バイトコードキャラクタとの + 間で行うか\cs{xspcode}によって指定でき、デフォルトではa--z, + A--Z, 0--9との間で行われるように設定されています。 + この処理を特定の箇所で禁止したい場合は、 + そこに\cs{kern0pt}、\cs{hskip0pt}などを挿入してください。 +\item 禁則処理は、禁則の対象となるキャラクタの前方あるいは + 後方にペナルティーを自動的に挿入することで実現しています。 + このペナルティーの設定は\cs{prebreakpenalty}、\cs{postbreakpenalty} + によって行います。デフォルト値は、kinsoku.texに記述されています。 +\item 現在、jtex、jlatexで扱えるフォントは明朝体とゴシック体です。 + これらのフォントの指定は、 + jtex, jlatexともに、\cs{mc}、\cs{gt}で行えます。 + これら以外のフォントは、英字フォントと同じように、 + 対象のフォントにあわせてJFM(TFM)を作れば使用できます。 +\item フォントの切り換えは、英字と漢字は独立して行われます。 + jlatexでは、\cs{large},\cs{small}などサイズ変更の + コントロールシーケンスによって、 + 連動してフォントをチェンジするようにしていますが、 + jtexではそのような操作は一切行っていませんので注意してください。 + ただし、指定したフォントが印字されるためには、それらの字体、サイズの + フォントがそろっていなければ行えません。 + jlatexでは、次のフォントが存在するものと仮定しています。 + \begin{quote} + min5, min6, min7, min8, min9, min10, + min10 magstephalf, min10 magstep1, + min10 magstep2, min10 magstep3, + min10 magstep4, min10 magstep5, \\ + goth5, goth6, goth7, goth8, goth9, goth10, + goth10 magstephalf, goth10 magstep1, + goth10 magstep2, goth10 magstep3, + goth10 magstep4, goth10 magstep5 + \end{quote} + これらが、きちんと印字されるかどうかはプリンタドライバの責任です。 + また、これらのフォントにはカーニング・パラメータが設定されています。 + カーニングを行いたくない場合は、上記のフォントの代りに以下のものを + 使用してください。こちらのフォントは、カーニングのパラメータが設定 + されていないことを除いて上記のものと全く同じものです。 + \begin{quote} + nmin5, nmin6, nmin7, nmin8, nmin9, nmin10, + nmin10 magstephalf, nmin10 magstep1, + nmin10 magstep2, nmin10 magstep3, + nmin10 magstep4, nmin10 magstep5, \\ + ngoth5, ngoth6, ngoth7, ngoth8, ngoth9, ngoth10, + ngoth10 magstephalf, ngoth10 magstep1, + ngoth10 magstep2, ngoth10 magstep3, + ngoth10 magstep4, ngoth10 magstep5 + \end{quote} +\item 現在のバージョンでは、全角スペースはほかの漢字キャラクタと同じように + 扱われます。 + 半角スペースのような特別の処理は行っていませんので注意してください。 +\item コントロールシーケンス名にも全角文字を使用することができますが + 次の点に注意してください。 + \begin{enumerate} + \item 全角の1区、2区、7区に含まれる文字は、カテゴリーコードの + 12つまり `Other\_character' と同様の扱いになります。 + したがって、これらの文字は ``エスケープ文字$+$1文字'' の + コントロールシーケンスとしてのみ扱えます。 + \item そのほかの文字に付いては、カテゴリーコードの11(letter)と + 同様に扱われます。 + また、これらの文字は半角文字と混在して使用することが + できます。 + \end{enumerate} +\item 半角カナは使えません。原稿内に半角カナのコードが入らないようにし + てください。 +\end{itemize} + +\section{追加されたプリミティブ} + +日本語\TeX にはつぎのプリミティブが追加されています。 +\begin{itemize} +\item \cs{{\bf kanjiskip}} + \begin{quote} + \cs{kanjiskip}$=$\angle{dimen} + \end{quote} + 連続する2バイトコード間に自動的に挿入するグルーの値を + 格納するレジスタです。 + ただし、この処理は\cs{autospacing}、\cs{noautospacing}によって + 行うか行わないかの指定ができます。\\ + このレジスタの値は、パラグラフの終わりまたは\cs{hbox}の最後の + 時点で取り込まれ、処理されます。 + したがって、同一パラグラフ内、あるいは\cs{hbox}内で何度か値を + 変化させたとしても、最後に設定された値によって全て処理されます。 + + \noindent + 使用例\\ + {\tt\cs{kanjiskip}$=$10pt plus 1pt minus 1pt}\\ + {\kanjiskip=10pt plus 1pt minus 1pt + とするとこうなります。\par} +\item \cs{{\bf xkanjiskip}} + \begin{quote} + \cs{xkanjiskip}$=$\angle{dimen} + \end{quote} + 連続する2バイトコードと\cs{xspcode}で指定された1バイトコードの間に + 自動的に挿入するグルーの値を格納するレジスタです。 + ただし、この処理は\cs{autoxspacing}、\cs{noautoxspacing}によって + 行うか行わないかの指定ができます。\\ + \cs{kanjiskip}と同様のタイミングで取り込まれ処理されます。 + + \noindent + 使用例\\ + {\tt\cs{xkanjiskip}$=$10pt plus 1pt minus 1pt}\\ + {\xkanjiskip=10pt plus 1pt minus 1pt + とするとalphabetやnumberとの間に挿入されるグルーが + 10pt plus 1pt minus 1ptになります。\par} +\item \cs{{\bf sjis}} + \begin{quote} + \cs{sjis}\angle{16--bit number} + \end{quote} + シフトJISコードから内部コードへの変換を行います。 + + \noindent + 使用例\\ + {\tt\cs{char}\cs{sjis}"889F}\\ + とすれば、`\char\sjis"889F' となります。 +\item \cs{{\bf jis}} + \begin{quote} + \cs{jis}\angle{16--bit number} + \end{quote} + JISコードから内部コードへの変換を行います。 + + \noindent + 使用例\\ + {\tt\cs{char}\cs{jis}"3022}\\ + とすれば、`\char\jis"3022' となります。 +\item \cs{{\bf kuten}} + \begin{quote} + \cs{kuten}\angle{16--bit number} + \end{quote} + 区点コードから内部コードへの変換を行います。 + 16進4桁の上2桁が区を下2桁が点であると解釈します。 + + \noindent + 使用例\\ + {\tt\cs{char}\cs{kuten}"1003}\\ + とすれば、`\char\kuten"1003' となります。 +\item \cs{{\bf xspcode}} + \begin{quote} + \cs{xspcode}\angle{8--bit number}$=$\angle{$0|1|2|3$} + \end{quote} + 2バイトコードと1バイトコードの間に自動的にスペースが挿入されますが、 + このプリミティブによってどの1バイトコードとの間でこの処理を行うか + どうかを指定できます。この指定は0--3のいずれかを選択することにより + 次のような動作を選択できます。 + \begin{itemize} + \item 0を設定することによりこの1バイトコード文字と2バイトコード文字 + の間での処理を禁止します。 + \item 1を設定することでこの文字と直前の2バイトコード文字との間にのみ + スペースを挿入することを許可します。 + \item 2を設定することにより直後の2バイトコード文字との間にのみ + スペースを挿入することを許可します。 + \item 3を設定することで前後の2バイトコード文字との間でのスペースの + 挿入を許可します。 + \end{itemize} + + \noindent + 使用例\\ + {\tt\cs{xspcode}`1=0\\ + \cs{xspcode}`2=3\\ + \cs{xspcode}`;=2}\\ + とすることにより、`1' に対する処理を禁止し、 + `2' に対して前後の処理を許可します。 + また、`;' に対しては直後へのスペースの挿入を許可します。 +\item \cs{{\bf inhibitxspcode}} + 指定した2バイトコードとそれに前後する1バイトコードの間に + 自動的に挿入されるスペースを抑制します。 + この指定は0--3のいずれかを選択することにより + 次のような動作を選択できます。 + \begin{itemize} + \item 0を設定することによりこの2バイトコード文字と1バイトコード文字 + の間での処理を禁止します。 + \item 1を設定することでこの文字と直前の1バイトコード文字との間に + スペースを挿入することを禁止します。 + \item 2を設定することにより直後の1バイトコード文字との間に + スペースを挿入することを禁止します。 + \item 3を設定することで前後の1バイトコード文字との間でのスペースの + 挿入を許可します。 + \end{itemize} + このプリミティブは、日本語\TeX のバージョン1.4で追加しました。 + + \noindent + 使用例\\ + {\tt\cs{xspjcode}`?=0\\ + \cs{xspjcode}`(=2\\ + \cs{xspjcode}`)=1} +\item \cs{{\bf jcharwidowpenalty}} + \begin{quote} + \cs{jcharwidowpenalty}$=$\angle{number} + \end{quote} + パラグラフの最後の全角文字が、孤立して改行されるのを防ぐための + ペナルティです。またパラグラフの最後が1文字以上の1区、2区、7区 + に含まれる文字の場合は、その直前にある全角文字に対してこの + ペナルティが使われます。 +\item \cs{{\bf autospacing}} + \begin{quote} + \cs{autospacing} + \end{quote} + このプリミティブによって2バイトコード間へのグルーの自動挿入を許可 + します。 +\item \cs{{\bf noautospacing}} + \begin{quote} + \cs{noautospacing} + \end{quote} + このプリミティブによって2バイトコード間へのグルーの自動挿入を禁止 + します。 +\item \cs{{\bf autoxspacing}} + \begin{quote} + \cs{autoxspacing} + \end{quote} + このプリミティブによって2バイトコードと1バイトコード間へのグルーの + 自動挿入を許可します。 +\item \cs{{\bf noautoxspacing}} + \begin{quote} + \cs{noautoxspacing} + \end{quote} + このプリミティブによって2バイトコードと1バイトコード間へのグルーの + 自動挿入を禁止します。 +\item \cs{{\bf prebreakpenalty}} + \begin{quote} + \cs{prebreakpenalty}\angle{16--bit number}$=$\angle{number} + \end{quote} + 指定する文字の前方に挿入するペナルティ値を設定します。 + この指定は、行頭禁則の指定にあたります。 + + \noindent + 使用例\\ + {\tt\cs{prebreakpenalty}`あ$=$1000}\\ + とすることにより、`あ' の前方に1000のペナルティ値が付けられます。 +\item \cs{{\bf postbreakpenalty}} + \begin{quote} + \cs{postbreakpenalty}\angle{16--bit number}$=$\angle{number} + \end{quote} + 指定する文字の後方に挿入するペナルティ値を設定します。 + この指定は、行末禁則の指定にあたります。\\ + ただし、\cs{prebreakpenalty}と\cs{postbreakpenalty}を同一の + 文字に対して同時に設定することはできません。 + 同一の文字に対して両方の指定を行った場合、後からの設定が有効になります。 +\item \cs{{\bf jfont}} \\ + 基本的な動作は、``\cs{font}'' と同じです。 + ただし、`\cs{showthe}' などのプリミティブと組み合せた場合に + カレントの漢字フォントを返します。 + フォントの定義は、\cs{font}, \cs{jfont}のどちらを使っても + 英字フォント、漢字フォントの定義が行えます。 +\item \cs{{\bf jfam}} \\ + `\cs{jfont}' と同様に ``\cs{fam}'' とほとんど同じ動作をします。 + `\cs{showthe}' などとの組み合せることで、カレントの漢字フォント + ファミリーを返します。 + ただしこのプリミティブでは、英字フォントのファミリーを + 漢字ファミリーとして定義できてしまいますので注意してください。 +\item {{\bf zw, zh}} \\ + プリミティブとは異なりますが、{\bf em, ex}と同じように + zw、zhは、それぞれカレントの2バイトコードフォントの幅(全角幅) + および高さの単位記号です。 + + \noindent + 使用例\\ + {\tt\cs{baselineskip}$=$1.5zh\\ + \cs{hsize}=20zw}\\ + でカレントフォントの高さの1.5倍の値が\cs{baselineskip}に代入され、 + \cs{hsize}が全角20文字分に設定されます。 +\end{itemize} + +\subsection{自動挿入されるスペースについて} +\cs{kanjiskip}や\cs{xkanjiskip}の自動挿入は、単純に連続する文字列ばかりでなく +shift\_amountが0である\cs{hbox}内の文字との前後関係においても行われます。 +これは、\cs{hbox}が入子状になっている場合でも同じです。 +つまり、その\cs{hbox}内に現れる最初の文字と最後の文字とが、 +boxの前後の文字に連続する文字列として解釈され、 +そこに指定されたスペースが挿入されることになります。 +\cs{vbox}はその対象とはなりません。具体的には以下の例を参考にしてください。 + +\begin{tabular}{l@{ $\longrightarrow$ }c} +\verb|あ\hbox{A}い| & あ\hbox{A}い \\ +\verb|あ\hbox{\hbox{A}}い| & あ\hbox{\hbox{A}}い \\ +\verb|あ\hbox{\hbox{\hbox{A}}}い| & あ\hbox{\hbox{\hbox{A}}}い \\ +\verb|あ\hbox{\hbox{\hbox{\hbox{A}}}}い| & あ\hbox{\hbox{\hbox{\hbox{A}}}}い \\ +\verb|あ\hbox{A\hbox{\vbox{\hbox{A}}}B}い| & + あ\hbox{A\hbox{\vbox{\hbox{A}}}B}い \\ +\verb|あ\hbox{\hbox{\vbox{\hbox{A}}}B}い| & + あ\hbox{\hbox{\vbox{\hbox{A}}}B}い \\ +\verb|あ\hbox{A\hbox{\vbox{\hbox{A}}}}い| & + あ\hbox{A\hbox{\vbox{\hbox{A}}}}い \\ +\verb|あfiい| & あfiい \\ +\verb|あ\hbox{\hbox{\vbox{\hbox{A}}}}い| & + あ\hbox{\hbox{\vbox{\hbox{A}}}}い \\ +\verb|あ\hbox{\vbox{\hbox{\hbox{A}}}}い| & + あ\hbox{\vbox{\hbox{\hbox{A}}}}い \\ +\verb|あ\vbox{\hbox{\hbox{\hbox{A}}}}い| & + あ\vbox{\hbox{\hbox{\hbox{A}}}}い \\ +\verb|A\hbox{あ}A| & A\hbox{あ}A \\ +\verb|A\hbox{\hbox{あ}}A| & A\hbox{\hbox{あ}}A \\ +\verb|A\hbox{\hbox{\hbox{あ}}}A| & A\hbox{\hbox{\hbox{あ}}}A \\ +\verb|A\hbox{\hbox{\hbox{\hbox{あ}}}}A| & A\hbox{\hbox{\hbox{\hbox{あ}}}}A \\ +\verb|A\hbox{あ\hbox{\vbox{\hbox{あ}}}あ}A| & + A\hbox{あ\hbox{\vbox{\hbox{あ}}}あ}A \\ +\verb|A\hbox{\hbox{\vbox{\hbox{あ}}}あ}A| & + A\hbox{\hbox{\vbox{\hbox{あ}}}あ}A \\ +\verb|A\hbox{あ\hbox{\vbox{\hbox{あ}}}}A| & + A\hbox{あ\hbox{\vbox{\hbox{あ}}}}A \\ +\verb|A\hbox{\hbox{\vbox{\hbox{あ}}}}A| \\ + A\hbox{\hbox{\vbox{\hbox{あ}}}}A \\ +\verb|A\hbox{\vbox{\hbox{\hbox{あ}}}}A| & + A\hbox{\vbox{\hbox{\hbox{あ}}}}A \\ +\verb|A\vbox{\hbox{\hbox{\hbox{あ}}}}A| & + A\vbox{\hbox{\hbox{\hbox{あ}}}}A \\ +\end{tabular} + +\section{日本語化されていないプリミティブ} +次のプリミティブついては、日本語化(2バイトコードに対応)されていません。 + +\begin{itemize} +\item \cs{catcode}, \cs{sfcode}, \cs{mathcode}, \cs{delcode}, + \cs{mathchardef}は、 + 2バイトコードに対してそれぞれの定義を行うことはできません。 +\item \cs{lccode}, \cs{uccode}は、2バイトコードをそのままとおし、 + ローワケース、アッパーケースの変更は行いません。 +\end{itemize} + + +\section{問題点} +現在のバージョンの日本語\TeX には、次のような問題点があります。 +使用の際には注意してください。 + +\begin{itemize} +\item 禁則処理および1バイトコードと2バイトコード間に挿入するグルーは、 + その処理の対象となる文字を単に文字コードでのみ判断しています。 + これは、2バイトコードの文字に対しては全く問題ないのですが、 + 1バイトコードの文字で問題が生じます。 + それは、\TeX の文字がコードと一対一に対応していないためで、 + フォントにより、特定のコードに割り付けられている文字が + 変ってしまいます。 + たとえば、`\{' はフォントcmsyの66$_{16}$に対応付けられています。 + 66$_{16}$は、アスキーコードで `n' を示すわけですから禁則の対象文字 + とはなっていないはずです。 + + したがって、今のままでは `\{' のような文字に対して自動的に禁則処理や + グルーの自動挿入を行うことは不可能です。 +\end{itemize} +%% cmsy の \{ は 0x6E でなく 0x66 (2001/08/24) +\end{document} diff --git a/Master/texmf-dist/doc/ptex/base/ptexdoc.tex b/Master/texmf-dist/doc/ptex/base/ptexdoc.tex new file mode 100644 index 00000000000..cecedc371c5 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/ptexdoc.tex @@ -0,0 +1,924 @@ +\documentstyle{jarticle} + +\西暦 + +\title{\TeX の出版への応用\\ + \large--- 縦組み機能の組み込み ---} +\author{濱野 尚人\thanks{(株)\kern-2pt アスキー % + 出版局 電子編集研究統轄部 出版技術部} + \and 田村 明史${}^*$ + \and 倉沢 良一\thanks{(株)\kern-2pt アスキー % + システムソフトウェア事業部 技術統轄部 オフィスシステム技術部}} +\date{\ } + +\setlength{\unitlength}{0.1in} + +\def\angle#1{$\langle{}$#1${}\rangle$} +\def\pTeX{p\kern-.2em\TeX} + +\begin{document} + +\maketitle \thispagestyle{empty} + +\begin{abstract} +日本語\TeX を出版分野で本格的に応用するため, 縦組み機能を追加した. +拡張された\TeX は以下のような特長を持つ. +\begin{itemize} +\item 同一文書, 同一ページに縦/横組みの混在ができ, + 縦組み中でも和/欧文/数式の混在が可能である. +\item 英語版のオリジナル\TeX や(横組み)日本語\TeX と互換性があり, + 従来の\TeX の文書やマクロをそのまま処理することができる. +\item 縦組みを使用すると, 拡張フォーマットの{\tt DVI}ファイルを出力する. + ただし, 横組みのみ使用している場合は, + 従来のフォーマットの{\tt DVI}ファイルを出力する. +\end{itemize} +本論文ではその設計と実現方法について説明する. +\end{abstract} + +% \tableofcontents + + +\section{はじめに} + +\TeX はスタンフォード大学のクヌース教授によって開発された組版システムであり, +組版の美しさと強力なマクロ機能を特徴としている. +日本語化され\cite{jtex}, 高品位の写植出力を得ることができるようになり, +わが国でも\TeX によって組版された書籍が出版されるようになってきた. + +ところが, 従来の日本語\TeX は英語向けのシステムをベースとしているため, +縦組み, ルビなどの日本語特有の機能がない. +\TeX を一般書籍の出版に使用するためするには, これらの機能を持った +「本格的出版に耐え得る日本語\TeX\kern0pt 」が必要であろうと判断し, +日本語\TeX の改造に取り組むことにした. +この機能拡張された\TeX を\pTeX (\kern0pt publishing \TeX\kern0pt )と +呼ぶことにする. +まず, 機能拡張第一弾として(株)\kern-3pt アスキーで開発された +日本語\TeX に縦組み機能を追加した. + +本論文ではその設計と実現方法について報告する. +次章から\ref{output}章までで\pTeX の縦組み機能についての基本的な概念を説明し, +\ref{imple}章で具体的な実現方法を説明する. + + +\section{ディレクション} \label{direction} + +文書を組版すると, いくつかの`ページ'の集合となる. +`ページ'は`行'を``行送り方向''に並べたものであり, +`行'は`文字'を``字送り方向''に並べたものである. + +従来の\TeX では, ページはverticalボックス, 行はhorizontalボックスであり, +``行送り方向'', ``字送り方向''は横組み用に固定されていた. +\pTeX では, \TeX の状態として``組み方向''(ディレクション)を考え, +ディレクションによって`行送り方向', `字送り方向'を変えることにした. +縦組みは, 横組みの``行送り方向'', ``字送り方向''を, +右に$90^\circ$回転させたものと同じになる. +\begin{quote} \begin{description} +\item[横組み] 字送り方向: 水平右向き, 行送り方向: 垂直下向き +\item[縦組み] 字送り方向: 垂直下向き, 行送り方向: 水平左向き +\end{description} \end{quote} + +また, 縦組み中で使われた場合と横組み中で使われた場合で +動作が変わるようなマクロが書けるように, +\verb|\iftdir|, \verb|\ifydir|というマクロも用意した. + +% \TeX の用語やプリミティブには上下左右を連想させる単語が多く使われているが, +% これらの上下左右は座標系に依存するものである. +% \TeX のプリミティブには\begin{quote} +% \verb|\belowdisplayshortskip|, \verb|\belowdisplayskip|, +% \verb|\lower|,\\ +% \verb|\abovedisplayshortskip|, \verb|\abovedisplayskip|, +% \verb|\raise|,\\ +% \verb|\rightskip|, \verb|\moveright|,\\ +% \verb|\leftskip|, \verb|\moveleft| +% \end{quote}のようなものもある. +% これらの, below, lowerは行送り方向, above, raiseは行送りの逆方向, +% rightは字送り方向, leftは字送りの逆方向を意味しているものとして, +% 縦組みでもそのまま使用する. + + +\section{ボックス} + +オリジナルの\TeX では, 文字を並べて``行''のボックスを作るモードをhモードと言い, +できたボックスをhボックスと呼ぶ. +これは\TeX がアメリカで開発されたシステムであり, +英語では文字が水平(\kern0pt horizontal\kern0pt )に並ぶからである. +ディレクションが横の場合はそのままで問題ない. +ディレクションが縦の場合, 行の中で文字は垂直に並ぶのだが, +やはり, 文字を並べて行のボックスを作るモードをhモードと言い, +できたボックスをhボックスと呼ぶことにした. +横組みと縦組みの両方で使えるマクロを作りやすいように, +`横組みの行のボックス'と`縦組みの行のボックス'は同じ名前の方が良く, +`横組みの行のボックス'は従来のhボックスと同じものだから, +互換性を考慮してそのようにした. + +同様に, ボックスを行送り方向に並べるモードをvモード, +それらを集めて作られたボックスをvボックスと呼ぶことにした. +横ディレクションのvモードではボックスは縦(\kern0pt vertical\kern0pt )に並ぶが, +縦ディレクションのvモードではボックスが水平に右から左へ並ぶことになる. + +\TeX を起動した直後は横ディレクションのvモードであり, +ディレクションを変えなければ従来の\TeX と互換性がある. +つまり, ここで文字を入力すると横ディレクションのhモードに移行し, +文字を左から右に並べていく. +ラインブレークによって作られたhボックスは, +横ディレクションのvモードで上から下に並べていく. + +\TeX のディレクションを変更するプリミティブとして, +\verb|\yoko|, \verb|\tate|を用意した. +ディレクションの変更は, +作成中のリストやボックスに何も入力されていない状態でのみ許すことにした. +\TeX を起動して何も入力されていない状態で\verb|\tate|プリミティブを実行すると, +縦ディレクションのvモードになる. +ここで文字を入力すると縦ディレクションのhモードに移行し +文字を上から下に並べていく. +ラインブレークによって作られたhボックスは, +縦ディレクションのvモードで右から左に並べていく. + +ボックスの大きさ(ベースラインの位置)を表す用語として, +\TeX ではWidth, Depth, Heightという言葉を使っている. +\pTeX では, +これらの言葉を, ボックスの字送り方向の大きさ(\kern0pt Width\kern0pt ), +行送り方向側の大きさ(\kern0pt Depth\kern0pt ), +行送り方向の反対側の大きさ(\kern0pt Height\kern0pt )であると定義した. +よって, 縦ディレクション中のボックスでは, ボックスの高さを$W$といい, +左側の幅を$D$といい, 右側の幅を$H$という. +\begin{quote} \begin{picture}(50,24)(0,4) + \put(4,26){\makebox(24,0)[b]{横ディレクション中のボックス}} + \put(4,24){\begin{picture}(0,0)(0,0) + \thicklines + \put(0,0){\vector(1,0){6}} + \put(0,0.5){\makebox(6,0)[b]{\small 字送り方向}} + \put(0,0){\vector(0,-11){6}} + \put(0,-6){\makebox(0,0)[t]{\small 行送り方向}} + \end{picture}} + \put(6,6){\begin{picture}(0,0)(0,0) + \thicklines + \put(6,0){\framebox(12,10){}} \put(6,4){\line(1,0){12}} + + \thinlines + \put(0,4){\line(1,0){5}} \put(19,4){\line(1,0){5}} + \put(3,0){\line(1,0){2}} \put(3,10){\line(1,0){2}} + \put(6,11){\line(0,1){2}} \put(18,11){\line(0,1){2}} + + \put(4,0){\vector(0,1){4}} \put(4,0){\vector(0,-1){0}} + \put(3.5,0){\makebox(0,4)[r]{$D$}} + \put(4,10){\vector(0,-1){6}} \put(4,10){\vector(0,1){0}} + \put(3.5,4){\makebox(0,6)[r]{$H$}} + \put(6,12){\vector(1,0){12}} \put(6,12){\vector(-1,0){0}} + \put(6,12.5){\makebox(12,0)[b]{$W$}} + \end{picture}} + \put(35,26){\makebox(18,0)[b]{縦ディレクション中のボックス}} + \put(53,24){\begin{picture}(0,0)(0,0) + \thicklines + \put(0,0){\vector(-1,0){6}} + \put(-6,0.5){\makebox(6,0)[b]{\small 行送り方向}} + \put(0,0){\vector(0,-11){6}} + \put(0,-6){\makebox(0,0)[t]{\small 字送り方向}} + \end{picture}} + \put(35,0){\begin{picture}(0,0)(0,0) + \thicklines + \put(0,6){\framebox(10,12){}} \put(4,6){\line(0,1){12}} + + \thinlines + \put(4,19){\line(0,1){5}} \put(4,0){\line(0,1){5}} + \put(0,19){\line(0,1){2}} \put(10,19){\line(0,1){2}} + \put(11,6){\line(1,0){2}} \put(11,18){\line(1,0){2}} + + \put(12,6){\vector(0,1){12}} \put(12,6){\vector(0,-1){0}} + \put(12.5,6){\makebox(0,12)[l]{$W$}} + + \put(4,20){\vector(-1,0){4}} \put(4,20){\vector(1,0){0}} + \put(0,20.5){\makebox(4,0)[b]{$D$}} + \put(4,20){\vector(1,0){6}} \put(4,20){\vector(-1,0){0}} + \put(4,20.5){\makebox(6,0)[b]{$H$}} + \end{picture}} +\end{picture} \end{quote} + +\subsection{異ディレクションのボックス} + +一つの文書, 一枚のページであっても部分によって組み方向を変えられるように, +組み方向の混在を許すことにした. +たとえば, 表の中で項目によって縦組み/横組みを使い分けることが可能になれば +表現力が増すことになる. +また, 縦組み中で数桁の数を表現するとき, +アラビア数字を横組みにして縦組み中に挿入することがある. +これを出版業界では連数字と言うが, これも組み方向の混在機能で実現できる. + +組み方向の混在を許すということは, 一つの文書に, +内部の文字が横に並ぶ横組みのhボックスと, +縦に並ぶ縦組みのhボックスの, 2種類のhボックスが存在することになる. +縦/横どちらのディレクションで作られたボックスであるか, ボックスごとに記録して, +これらの組み方向の異なるボックスを区別することにした. + +\verb|\hbox|, \verb|\vbox|などで作られるボックスは, 通常, +\verb|\hbox|, \verb|\vbox|が実行されたときの\TeX のディレクションと +同じディレクションを持つ. +しかし以下のように\verb|\yoko|プリミティブを使うと, +縦ディレクションの中に, +`123'という内容の横ディレクションを持つhボックスを置くこともできる. +\begin{quote} + (縦ディレクション)\\ + \verb|\hbox{\yoko 123}| +\end{quote} + +\verb|\hbox|, \verb|\vbox|でディレクションの異なるボックスを作ると, +横ディレクションを持つボックスは, 縦組み中では +$W_t=H_y+D_y$, $H_t=W_y/2$, $D_t=W_y/2$ +($H_y$は, ボックスの横ディレクション中における$H$)となる. +縦ディレクションを持つボックスは, 横組み中では +$W_y=H_t+D_t$, $H_y=W_t$, $D_y=0$となる. + +\begin{quote} \begin{picture}(50,24)(0,0) + \put(0,22){\makebox(16,0)[b]{縦組み中の横組みのボックス}} + \put(0,0){\begin{picture}(0,0)(0,0) + \thicklines + \put(0,6){\framebox(12,10){}} \put(0,10){\line(1,0){12}} + + \thinlines + \put(2,10){\vector(0,-1){4}} \put(2,10){\vector(0,1){0}} + \put(2.5,6){\makebox(0,4)[l]{$D_y$}} + \put(2,10){\vector(0,1){6}} \put(2,10){\vector(0,-1){0}} + \put(2.5,10){\makebox(0,4)[l]{$H_y$}} + \put(0,14){\vector(1,0){12}} \put(0,14){\vector(-1,0){0}} + \put(0,13.5){\makebox(12,0)[t]{$W_y$}} + + \put(6,0){\line(0,1){5}} \put(6,17){\line(0,1){5}} + \put(0,17){\line(0,1){2}} \put(12,17){\line(0,1){2}} + \put(13,6){\line(1,0){2}} \put(13,16){\line(1,0){2}} + + \put(14,6){\vector(0,1){10}} \put(14,6){\vector(0,-1){0}} + \put(14.5,6){\makebox(0,10)[l]{$W_t$}} + \put(6,18){\vector(-1,0){6}} \put(6,18){\vector(1,0){0}} + \put(0,18.5){\makebox(6,0)[b]{$D_t$}} + \put(6,18){\vector(1,0){6}} \put(6,18){\vector(-1,0){0}} + \put(6,18.5){\makebox(6,0)[b]{$H_t$}} + \end{picture}} + \put(30,22){\makebox(22,0)[b]{横組み中の縦組みのボックス}} + \put(30,4){\begin{picture}(0,0) + \thicklines + \put(6,0){\framebox(10,12){}} \put(10,0){\line(0,1){12}} + + \thinlines + \put(14,0){\vector(0,1){12}} \put(14,0){\vector(0,-1){0}} + \put(13.5,0){\makebox(0,12)[r]{$W_t$}} + \put(10,10){\vector(-1,0){4}} \put(10,10){\vector(1,0){0}} + \put(6,9.5){\makebox(4,0)[t]{$D_t$}} + \put(10,10){\vector(1,0){6}} \put(10,10){\vector(-1,0){0}} + \put(10,9.5){\makebox(4,0)[t]{$H_t$}} + + \put(0,0){\line(1,0){5}} \put(17,0){\line(1,0){5}} + \put(3,12){\line(1,0){2}} + \put(6,13){\line(0,1){2}} \put(16,13){\line(0,1){2}} + + \put(4,0){\line(0,-1){2}} \put(4,0){\vector(0,1){0}} + \put(3.5,-2){\makebox(0,2)[r]{$D_y$}} + \put(4,0){\vector(0,1){12}} \put(4,0){\vector(0,-1){0}} + \put(3.5,0){\makebox(0,12)[r]{$H_y$}} + \put(6,14){\vector(1,0){10}} \put(6,14){\vector(-1,0){0}} + \put(6,14.5){\makebox(10,0)[b]{$W_y$}} + \end{picture}} +\end{picture} \end{quote} + +二つの場合で$W$, $D$, $H$の算出方法が異なるのは, +縦組み, 横組みでの文字の扱いの違い(\ref{jfont}参照)を反映している. + +\TeX には256個のボックスレジスタが用意されていて +\begin{quote} + \verb|\setbox123\hbox{\yoko |\angle{文}\verb|}| +\end{quote} +と書けば, ボックスレジスタの123番に\angle{文}を内容とする +横ディレクションのhボックスが登録される. +登録されたボックスは +\begin{quote} \begin{verbatim} + \advance\ht123 by \dp123 + \dp123=0 +\end{verbatim} \end{quote} +のように, \verb|\wd|, \verb|\dp|, \verb|\ht|を使って +ボックスの大きさやベースラインの位置を自由に変えることができる. +\pTeX では, レジスタの内容は +\begin{quote} \begin{verbatim} + \hbox{\tate\copy123} + \hbox{\yoko\box123} +\end{verbatim} \end{quote} +のようにどのディレクションで使用されるかわからず, +ボックスが使用されるディレクションによって, $W$, $D$, $H$は異なる値を持つ. +そこで\verb|\wd|なども, +そのときのディレクション用の$W$などをアクセスすることにした. +\begin{quote} + \verb|\hbox{\yoko \global\wd123=|\angle{縦高さ}\verb|}|\\ + \verb|\hbox{\tate \global\wd123=|\angle{横幅}\verb|}|\\ + \verb|\hbox{\tate\copy123}|\\ + \verb|\hbox{\yoko\box123}| +\end{quote} +のように書けば, 3行目の\verb|\copy123|の$W$は\angle{縦高さ}であり, +4行目の\verb|\box123|の$W$は\angle{横幅}である. + +この場合注意しなければならないのは, +\verb|\hbox|, \verb|\vbox|で作られたボックスは +$W_t=H_y+D_y$, $W_y=H_t+D_t$であるが, +\verb|\wd|, \verb|\dp|, \verb|\ht|を使って$W$, $D$, $H$を変更すると +この関係は必ずしも成立しないということである. +ディレクションによってボックスの大きさが変化することになる. + +\subsection{異ディレクションのアジャスト, インサート} + +vモードや内部vモードの中のhボックスの中に\verb|\vadjust|を使うと, +vリストのそのボックスの次に, \verb|\vadjust|の内容が挿入される. +以下のようにディレクションの異なるhボックスの中でも +支障なく\verb|vadjust|が使えるようにした. +\begin{quote} + (縦ディレクション, vモード)\\ + \verb|\hbox{\yoko |\ldots\verb|\vadjust{|\ldots\verb|}|\ldots\verb|}| +\end{quote} +\verb|\vadjust|の中括弧の内側は, 自動的に, +それがアジャストされるリストのディレクションである縦ディレクションになる. + +\verb|\insert|の場合, クラスによってディレクションを変えたい場合もある. +たとえば文書全体は縦組みで, 脚注は横組みするとしよう. +図をクラス12のインサートで, 脚注をクラス34のインサートで処理することにする. +\begin{quote} + (縦ディレクション, vモード)\\ + \ldots\verb|\insert12{\tate |\ldots\verb|}|\ldots\\ + \ldots\verb|\insert34{\yoko |\ldots\verb|}|\ldots\\ + \ldots\verb|\insert12{\tate |\ldots\verb|}|\ldots\\ + \ldots\verb|\insert34{\yoko |\ldots\verb|}|\ldots +\end{quote} +このように書けば, +ボックスレジスタ12には縦ディレクションで図が集められ, +ボックスレジスタ34には横ディレクションで脚注が集められるようにした. +なお, 同じクラスに違うディレクションを混ぜて使うことはできない. + + +\section{縦組みに使用する文字} \label{font} + +\subsection{縦組み用日本語フォント} + +\TeX は各フォントに一つずつ用意されている +{\tt TFM}(\kern0pt{\it\TeX\/} {\it F\/}ont {\it M\/}etric\kern0pt )ファイルを +参照して組版を行う. +{\tt TFM}ファイルにはそのフォントに含まれる各文字の大きさなど +組版に必要な情報が定義してある. + +\pTeX でも同様であるが, 日本語のフォントの場合, 同じ書体でも +縦組みで使うか横組みで使うかによって, 組版に必要な情報は変わってくる. +たとえば, ``り''という文字は比較的縦に長い文字であるが, +このような文字は横組みではとなりの文字との間隔をつめて組むことはできても, +縦組みではある程度間隔を空けないと読みにくくなってしまう. +そこで, 横組み時と縦組み時では, +別の\verb|TFM|ファイルを参照して組版することにした. +\TeX から見ると, 縦組みと横組みでは別のフォントを使っているように +見えることになる. +ただし, 組み方向によるフォントの切り替えは, +ユーザーが気にする必要がないように自動的に行うようにした. +和文用のカレントフォントを2つ用意し, +ディレクションによって自動的に切り替えるようにしてある. +また{\tt TFM}ファイルに縦組み用か横組み用かの情報を埋め込み, +フォントを指定したとき, 自動的に適切なカレントフォントを切り替えるようにした. + +\label{jfont} +横組みでは, ベースラインは文字の下の方を通っている. +縦組みの和文フォントは, ベースラインが文字の中央を通ることにした. +行の途中で文字の大きさを変えたとき, そのほうが自然だと判断したからである. + +\subsection{縦組み中の欧文} + +縦組みの部分に欧文や数式が出てくると, +従来の\TeX の欧文用フォントを$90^\circ$回転して上から下に向かって組んでいく. +これは普通に横に組んだ欧文を, 90度回転させたような結果になる. +ところが, \ref{jfont}で説明したように, +縦組みの和文のベースラインは文字の中心を通るようにしたので, +そこに欧文のベースラインを一致させると行がずれて見えてしまう. +そこで, \verb|\tbaselineshift|というdimen変数を用意し, +その寸法だけ縦組み中の欧文のベースラインをシフトさせることにした. + +横組みでも, 和文と欧文のベースラインの位置を細かく調節しないと, +フォントのデザインによってはバランスが悪くなる場合があり, +\verb|\ybaselineshift|を用意して調節可能にした. + +\begin{quote} \begin{picture}(0,46) + \put(4,41){\line(0,1){5}} + \put(4,40){\begin{picture}(0,0) + \thicklines + \put(-7,-14){\framebox(14,14){縦組みの漢字}} + \put(0,0){\line(0,-1){14}} + + \thinlines + \put(8,0){\line(1,0){2}} \put(8,-14){\line(1,0){2}} + \put(-7,1){\line(0,1){2}} \put(7,1){\line(0,1){2}} + + \put(9,0){\vector(0,-1){14}} \put(9,0){\vector(0,1){0}} + \put(9.5,-14){\makebox(0,14)[l]{$W$}} + \put(0,2){\vector(1,0){7}} \put(0,2){\vector(-1,0){0.0}} + \put(0,2.5){\makebox(7,0)[b]{$H$}} + \put(0,2){\vector(-1,0){7}} \put(0,2){\vector(1,0){0.0}} + \put(-7,2.5){\makebox(7,0)[b]{$D$}} + \end{picture}} + \put(4,19){\line(0,1){6}} \put(0,19){\line(0,1){5}} + \put(0,23){\vector(1,0){4}} \put(0,23){\vector(-1,0){0}} + \put(4.5,23){\makebox(0,0)[l]{\tt \char92 tbaselineshift}} + \put(0,18){\begin{picture}(0,0) + \thicklines + \put(-4,-12){\framebox(12,12){英字($90^\circ$ 回転)}} + \put(0,0){\line(0,-1){12}} + + \thinlines + \put(-4,1){\line(0,1){2}} \put(8,1){\line(0,1){2}} + \put(9,0){\line(1,0){2}} \put(9,-12){\line(1,0){2}} + + \put(-4,2){\vector(1,0){4}} \put(-4,2){\vector(-1,0){0}} + \put(-4,2.5){\makebox(4,0)[b]{$D$}} + \put(0,2){\vector(1,0){8}} \put(0,2){\vector(-1,0){0}} + \put(4,2.5){\makebox(4,0)[b]{$H$}} + \put(10,0){\vector(0,-1){12}} \put(10,0){\vector(0,1){0}} + \put(10.5,0){\makebox(0,-12)[l]{$W$}} + \end{picture}} + \put(4,0){\line(0,1){5}} + + \put(16,8){\line(1,0){5}} + \put(22,8){\begin{picture}(0,0) + \thicklines + \put(0,-2){\framebox(14,14){横組みの漢字}} + \put(0,0){\line(1,0){14}} + + \thinlines + \put(-3,-2){\line(1,0){2}} \put(-3,12){\line(1,0){2}} + \put(0,13){\line(0,1){2}} \put(14,13){\line(0,1){2}} + \put(-2,0){\vector(0,-1){2}} \put(-2,0){\vector(0,1){0}} + \put(-2.5,-2){\makebox(0,2)[r]{$D$}} + \put(-2,0){\vector(0,1){12}} \put(-2,0){\vector(0,-1){0}} + \put(-2.5,0.0){\makebox(0.0,12.0)[r]{$H$}} + \put(0,14){\vector(1,0){14}} \put(0,14){\vector(-1,0){0}} + \put(0,14.5){\makebox(14,0.0)[b]{$W$}} + \end{picture}} + \put(37,8){\line(1,0){6}} \put(38,9){\line(1,0){5}} + \put(39,9){\vector(0,-1){0}} \put(39,8){\vector(0,1){0}} + \put(39,4){\line(0,1){7}} + \put(39,3.5){\makebox(0,0)[t]{\tt \char92 ybaselineshift}} + \put(44,9){\begin{picture}(0,0) + \thicklines + \put(0,-4){\framebox(12,12){英字(正立)}} + \put(0,0){\line(1,0){12}} + + \thinlines + \put(-3,-4){\line(1,0){2}} \put(-3,8){\line(1,0){2}} + \put(0,9){\line(0,1){2}} \put(12,9){\line(0,1){2}} + + \put(-2,0){\vector(0,-1){4}} \put(-2,0){\vector(0,1){0}} + \put(-2.5,-4){\makebox(0,4)[r]{$D$}} + \put(-2,0){\vector(0,1){8}} \put(-2,0){\vector(0,-1){0}} + \put(-2.5,0){\makebox(0,8)[r]{$H$}} + \put(0,10){\vector(1,0){12}} \put(0,10){\vector(-1,0){0}} + \put(0,10.5){\makebox(12,0)[b]{$W$}} + \end{picture}} + \put(57,8){\line(1,0){5}} +\end{picture} \end{quote} + + +\section{縦組み中の数式} + +縦組み中の数式も, 欧文と同様にシフトさせなければならない. +\TeX の数式には, 分数の線の高さなどを決定するための +axis(軸)という概念があるので, これでシフト量を決定することにした. + +問題は次のような場合である. +\begin{quote} + (縦ディレクション, hモード)\\ + \ldots\verb|$ \hbox{$ |\angle{数式}\verb| $} $|\ldots +\end{quote} +この場合, 数式モードがネスティングされることになるので, +内側の\angle{数式}は2回シフトされることになってしまう. +これを避けるため, \verb|$| の内側は, +普通の縦ディレクションではない縦数式ディレクションに移行することにした. +縦数式ディレクションでは +文字やボックスの並ぶ方向は縦ディレクションと同じであるが, +その他の動作は横組みと同様である. +数式ディレクション中で数式モードに移行してもシフトは行わず, +また, 日本語のフォントは横組みカレントフォントを使用する. +つまり, 数式は横組みで組んだものを時計回りに90度回転して, +縦組み中に挿入する形になる. + +便宜的に, 横組みでも数式モードに入ると横数式ディレクションに入ることにした. +現在のディレクションが通常のディレクションであるか, +数式ディレクションであるかは, \verb|\ifmdir|でテストできる. + + +\section{組版結果の出力} \label{output} + +\TeX は\verb|\shipout|プリミテイブで, ボックスの左上隅が紙の左上隅から, +右に $\verb|\hoffset|+1インチ$, +下に $\verb|\voffset|+1インチ$ の位置になるように, +{\tt DVI}(\kern0pt{\it D\/}e{\it v\/}ice {\it I\/}ndependent\kern0pt ) +ファイルに出力する. +\pTeX も同様である. +\verb|\hoffset|, \verb|\voffset|は, ほかのプリミティブ名と違って, +ディレクションに関係なく, h, vが本当にholizontal, vertcalを意味している. + +従来の\verb|DVI|命令は, \.横\.組\.み\.の\.と\.きファイルが小さくなるように +工夫されている. +たとえば, ``文字の印字''と``文字幅だけ右へ移動''が, +1つの命令でできるようになっている. +\pTeX では, 縦組みの場合でも横組みと同様にファイルが小さくなるように, +\verb|DVI|フォーマットを拡張した. + +ただし, たとえば従来の文書をこの\TeX で処理した場合など, +その文書内で縦組みを使用していない場合, +従来のものと同じフォーマットの{\tt DVI}を出力する. +また, プリアンブル, ポストアンブルをテストすれば, +文書内した縦組みを使用した箇所が存在するかどうかを知ることができるようにした. + + +\section{インプリメント} \label{imple} + +現在構築中のリストのネスティング状態を示す +レコード(\kern0pt {\it list\_state\_record\/})に, +ディレクションを表すフィールドを追加し, +トップのディレクションをマクロ{\it direction\/}でアクセスできるようにした. +{\it direction\/}の値は{\it dir\_yoko\/}か, {\it dir\_tate\/}か, +$-{\it dir\_yoko\/}$か, $-{\it dir\_tate\/}$である. +$-{\it dir\_yoko\/}$, $-{\it dir\_tate\/}$は数式ディレクションを意味する. + +各種ノードにディレクションを保持するフィールドを加えなければならない. +ボックスを表す{\it hlist\_node\/}, {\it vlist\_node\/}では +第1ワードの{\it sub\_type}フィールドが未使用だったので, +これを{\it box\_dir\/}として使うことにした. +\verb|\insert|によって生成される +{\it ins\_node\/}には空いているフィールドがなかったので, +サイズを1ワード大きくして全部で6ワードにし, +最後の1ワードを{\it ins\_dir\/}として使うことにした. + +\subsection{\it dir\_node} + +縦ディレクションのリストに横ディレクションのボックスを追加するような場合, +間に{\it dir\_node\/}を挿入して, ボックスの大きさなどを整合させる. +{\it dir\_node\/}は, {\it hlist\_node\/}, {\it vlist\_node\/}と +全く同じ構造を持っている. +リストにはこの{\it dir\_node\/}が挿入され, +{\it dir\_node\/}の{\it box\_dir\/}にはリストのディレクションが, +{\it width\/},{\it depth\/},{\it height\/}には, +リストのディレクションで見た, ボックスの$W$, $D$, $H$の値が入っている. +{\it dir\_node\/}の{\it list\_ptr\/}は実体のボックスを指すポインタである. +実体のボックス({\it hlist\_node\/}, {\it vlist\_node\/})の +{\it box\_dir\/}にはボックスのディレクションが, +{\it width\/},{\it depth\/},{\it height\/}には, +ボックスのディレクションで見た, $W$, $D$, $H$の値が入っている. + +たとえば +\begin{quote} + (縦ディレクション)\\ + {\gt \verb|昭和\hbox{\yoko 38}年|} +\end{quote} +は図のようなリストを作る. +\begin{quote} \begin{picture}(40,25)(-4,-22) + \thinlines + \put(0,0){\begin{picture}(0,0) + \put(-4,-3){\framebox(8,4){}} + \put(0,0){\vector(1,0){6}} + \put(0,0){\circle*{0.3}} + \put(-4,-1){\line(1,0){8}} + \put(-4,-3){\makebox(8,2)[c]{`昭'}} + \end{picture}} + \put(10,0){\begin{picture}(0,0) + \put(-4,-3){\framebox(8,4){}} + \put(0,0){\vector(1,0){6}} + \put(0,0){\circle*{0.3}} + \put(-4,-1){\line(1,0){8}} + \put(-4,-3){\makebox(8,2)[c]{`和'}} + \end{picture}} + \put(20,0){\begin{picture}(0,0) + \put(-4,-7){\framebox(8,8){}} + \put(-4,-1){\makebox(4,2)[c]{\bf 縦}} + \put( 0,-1){\line(0,1){2}} + \put( 2, 0){\vector(1,0){4}} + \put(2,0){\circle*{0.3}} + \put(-4,-1){\line(1,0){8}} + \put(-4,-5){\makebox(8,4)[c]{\it dir\_node\/}} + \put(-4,-5){\line(1,0){8}} + \put( 0,-6){\circle*{0.3}} + \put( 0,-6){\vector(0,-1){3}} + \end{picture}} + \put(30,0){\begin{picture}(0,0) + \put(-4,-3){\framebox(8,4){}} + \put(-4,-1){\line(4,1){8}} + \put(-4,-1){\line(1,0){8}} + \put(-4,-3){\makebox(8,2)[c]{`年'}} + \end{picture}} + + \put(20,-10){\begin{picture}(0,0) + \put(-4,-7){\framebox(8,8){}} + \put(-4,-1){\makebox(4,2)[c]{\bf 横}} + \put( 0,-1){\line(0,1){2}} + \put( 0,-1){\line(2,1){4}} + \put(-4,-1){\line(1,0){8}} + \put(-4,-5){\makebox(8,4)[c]{\it hlist\_node\/}} + \put(-4,-5){\line(1,0){8}} + \put( 0,-6){\circle*{0.3}} + \put( 0,-6){\vector(0,-1){3}} + \end{picture}} + + \put(20,-20){\begin{picture}(0,0) + \put(-4,-3){\framebox(8,4){}} + \put(0,0){\vector(1,0){6}} + \put(0,0){\circle*{0.3}} + \put(-4,-1){\line(1,0){8}} + \put(-4,-3){\makebox(8,2)[c]{`3'}} + \end{picture}} + \put(30,-20){\begin{picture}(0,0) + \put(-4,-3){\framebox(8,4){}} + \put(-4,-1){\line(4,1){8}} + \put(-4,-1){\line(1,0){8}} + \put(-4,-3){\makebox(8,2)[c]{`8'}} + \end{picture}} +\end{picture}\end{quote} +\begin{quote}\gt\begin{verbatim} + \tmin 昭 + \tmin 和 + \dirboxT(5.00002+5.00002)x6.44444 + .\hboxY(6.44444+0.0)x10.00003 + ..\tenrm 3 + ..\tenrm 8 + \penalty 500(for \chrwidowpenalty) + \glue(\kanjiskip) 0.0 plus 0.4 minus 0.4 + \tmin 年 +\end{verbatim} \end{quote} + +`\verb|\hbox{|'と入力されると, +それまでのリストやモードやディレクションがセーブされ, +新たなリストやモードやディレクションが用意される. +\verb|\tate|や\verb|\yoko|は, +その時点でのリストが空であればディレクションを変更する. +`\verb|\hbox{|'に対応する`\verb|}|'が入力されると, +まず, \verb|\hbox{}|の内部のディレクションと同じディレクションのボックスが +作られる. +そのディレクションと\verb|\hbox{}|の外側のディレクションが一致していなければ, +{\it dir\_node}を使って, ディレクションが整合させられる. + +\subsection{\it disp\_node} + +和文中の欧文や数式のベースラインをシフトさせるために, +新種のノード{\it disp\_node\/}(\kern0pt displacement node\kern0pt )を +導入することにした. +このノードは, リンク情報ワードのほかに +{\it disp\_dimen\/}フィールド(1ワード)を持っている. +{\it disp\_node\/}はhリスト中にのみ存在し, +このノード以降のすべてのノードのベースラインを, +{\it disp\_dimen}だけ行送り方向にシフトさせる. + +たとえば, 縦ディレクションで\verb|\tbaselineshift|の値が2ポイントのとき, +\begin{quote}\gt + \ldots\verb|このdispノード|\ldots +\end{quote} +のように入力すると`\verb|disp|'の前に2ポイントの{\it disp\_node\/}, +後に0ポイントの{\it disp\_node\/}が挿入される. +\begin{quote}\gt\begin{verbatim} + \tmin こ + \tmin の + \displace 2.0 + \glue(\xkanjiskip) 2.5 plus 1.0 minus 1.0 + \tenrm d + \tenrm i + \tenrm s + \tenrm p + \displace 0.0 + \glue(\xkanjiskip) 2.5 plus 1.0 minus 1.0 + \tmin ノ + \penalty 200(for kinsoku) + \glue(\kanjiskip) 0.0 plus 0.4 minus 0.4 + \tmin ー + \penalty 500(for \chrwidowpenalty) + \glue(\kanjiskip) 0.0 plus 0.4 minus 0.4 + \tmin ド +\end{verbatim} \end{quote} +文字(\kern0pt {\it char\_node\/}), +ボックス(\kern0pt {\it hlist\_node\/}, {\it vlist\_node\/}, {\it dir\_node\/}), +罫線(\kern0pt {\it rule\_node\/})以外のノードには, +$H$や$D$がないので{\it disp\_node\/}の影響を受けない. +だから +\begin{quote}\gt + \ldots\verb|このdvi fileフォーマット|\ldots +\end{quote} +のように入力されたとき, \verb|device|と\verb|independent|の間の空白の前後に +{\it disp\_node\/}を入れるのは無駄である. +\begin{quote}\gt\begin{verbatim} + \tmin こ + \tmin の + \displace 2.0 + \glue(\xkanjiskip) 2.5 plus 1.0 minus 1.0 + \tenrm d + \tenrm v + \tenrm i + \displace 0.0 + \glue 3.33333 plus 1.66666 minus 1.11111 + \displace 2.0 + \tenrm ^^L (ligature fi) + \tenrm l + \tenrm e + \displace 0.0 + \glue(\xkanjiskip) 2.5 plus 1.0 minus 1.0 + \tmin フ + \penalty 150(for kinsoku) + \glue 1.07391 minus 1.07391 + \tmin ォ +\end{verbatim} \end{quote} +そこで, リストに{\it disp\_node\/}を加えるとき, +無駄な{\it disp\_node\/}を消すようにした. +\begin{quote}\gt\begin{verbatim} + .\tmin こ + .\tmin の + .\displace 2.0 + .\glue(\xkanjiskip) 2.5 plus 1.0 minus 1.0 + .\tenrm d + .\tenrm v + .\tenrm i + .\glue 3.33333 plus 1.66666 minus 1.11111 + .\tenrm ^^L (ligature fi) + .\tenrm l + .\tenrm e + .\displace 0.0 + .\glue(\xkanjiskip) 2.5 plus 1.0 minus 1.0 + .\tmin フ + .\penalty 150(for kinsoku) + .\glue 1.07391 minus 1.07391 + .\tmin ォ +\end{verbatim} \end{quote} + +\subsection{縦組み用{\tt TFM}ファイル} + +縦組みフォント用拡張{\tt TFM}ファイルのフォーマットは, 基本的には, +従来の{\tt JFM}フォーマット\cite{jfm}と変わらない. +ただ各フィールドの意味が多少変化している. +最初のハーフワード(\kern0pt {\it id}\kern0pt )で +{\tt JFM}フォーマットであることを示す. +$\hbox{\it id} = 11$ の場合は横組み用{\tt JFM}, +$\hbox{\it id} = 9$ の場合は縦組み用{\tt JFM}である. + +{\it width}, {\it italic}, {\it kern}, {\it glue}など +従来の横組み{\tt JFM}フォーマットで横方向の意味を持っていたフィールドは, +縦組み{\tt JFM}では縦(字送り)方向の意味を持つ. +たとえば{\it width}はその文字の縦方向の大きさである. + +{\it height}, {\it depth}など +従来の横組み{\tt JFM}で縦方向の意味を持っていたフィールドは, +縦組み{\tt JFM}では横(行送り)方向の意味を持つ. +{\it height}はその文字のベースラインの右側の大きさ, +{\it depth}はその文字のベースラインの左側の大きさである. + +\subsection{拡張{\tt DVI}フォーマット} + +従来の\verb|DVI|には水平方向へ移動する命令として\verb|right|, +垂直方向へ移動する命令として\verb|down|という名前が使用されている. +hボックスを``水平ボックス''ではなく``字送り方向のボックス''と定義したように +\verb|right|命令を字送り方向へ移動する命令, +\verb|down|命令を行送り方向へ移動する命令と定義した. +字送り, 行送りの方向は, 組み方向によって変わるので, +\verb|DVI|リーダにもディレクションを設けて, +新しい命令\verb|dir|によってディレクションを切り換えることにした. +\verb|push|, \verb|pop|で, $(h,v,w,x,y,z)$の他に, +ディレクション$d$もpush, popする. + +\verb|DVI|の命令は最初の1バイトで識別できるようになっている. +すでに0--249が使用されている\footnote{ + \TeX を, 英語などの左から右へ書く言語と, + アラビア語やヘブライ語のように右から左へ書く言語を + 混植できるように改造した事例\cite{arabic}では, + そのインプリメントの方法として\verb|DVI|命令を拡張しており, + 250, 251を使用している. +}ので新しい命令は255を使うことにした. +\verb|dir|(\kern0pt 255\kern0pt )命令は1バイトの引数$d$を1つ取る. +\begin{itemize} +\item $d=0$ $\cdots$ 横組み +\item $d=1$ $\cdots$ 縦組み +\end{itemize} + +横ディレクションの場合は従来の\verb|DVI|とコンパチブルであるが, +縦ディレクションの場合は従来の\verb|DVI|で横方向に移動する命令 +\begin{quote} \begin{verbatim} + set_char_* set? set_rule right? w? x? +\end{verbatim} \end{quote} +は縦方向(字送り方向)に移動する命令となり, +従来の\verb|DVI|で縦方向に移動する命令 +\begin{quote} \begin{verbatim} + down? y? z? +\end{verbatim} \end{quote} +は横方向(行送り方向)に移動する命令となる. + +文字は, ベースラインの方向が字送りの方向と一致するように, +必要なら回転して, 印字されなければならない. +罫線の命令もディレクションによって方向が変わる. +従来の\verb|set_rule|, \verb|put_rule|では, +最初の引数が高さ, 次の引数が幅を表していた. +拡張\verb|DVI|では, 最初の引数が罫線の行送り方向の反対側の大きさ, +次の引数が字送り方向の大きさを表している. +\verb|set_rule|では2番目の引数で指定してある長さだけ +字送り方向に参照点を移動させる. + +各ページの先頭では, {\tt DVI}リーダは横ディレクションであり, +拡張\verb|DVI|対応のプリンタドライバで, 従来の\verb|DVI|もプリントアウトでき, +拡張命令(\kern0pt \verb|dir|\kern0pt )を使っていない\verb|DVI|ファイルは, +従来のプリンタドライバでプリントアウトできる. + +\verb|DVI|ファイルには, ファイルの先頭(\kern0pt preamble\kern0pt )と +末尾(\kern0pt postamble\kern0pt )に\verb|DVI|のバージョンを表す +{\it id\_byte}が書き込まれている. +従来の\verb|DVI|ではどちらの{\it id\_byte}も2である. +拡張命令を使っている\verb|DVI|ファイルでは, postambleの{\it id\_byte}を3にして, +拡張プリンタドライバでプリントアウトしなければならないことを表す. + + +\section{日本語\TeX との互換性} + +\pTeX は, 機能面では従来の日本語\TeX との完全な互換性を保っている. + +性能面での違いを比較するために +SONY NEWS 1460上の日本語\TeX と\pTeX で本論文を組版し, +cshのtimeコマンドでCPU時間を比較してみた. +なおこのテストでは, あらかじめauxファイルを作成しておき, +{\tt virtex}に\LaTeX のフォーマットファイルを読み込ませる形で起動して計測した. +\begin{itemize} +\item 日本語\TeX の場合:\\ + \verb|24.7u 0.3s 0:25 99% 44+123k 0+16io 0pf+0w| + +\item \pTeX の場合:\\ + \verb|25.0u 0.3s 0:25 99% 46+121k 0+16io 0pf+0w| +\end{itemize} + +やはり多少負荷は重くなっているようだが, +約1 \%なのでほとんど変っていないと言っていいと思う. +これは, \pTeX を日本語\TeX の置き換えとして使用しても +支障はないということを意味している. + + +\section{おわりに} + +今回行った\TeX の改造は, 相当大規摸なものである. +アスキー版日本語\TeX の段階で既に{\tt trip test}をパスしなくなっており, +これにさらに改造を加えたので, +`もはやこれは\TeX ではない'という意見もあるかも知れない. +私は, \TeX の根本は以下の3項目であろうと考えている. +\begin{itemize} +\item ボックスとグルー +\item ラインブレーク, ページブレーク +\item マクロ +\end{itemize} +この機構は単純であるにもかかわらず非常に強力で, +組版の諸問題をほぼ解決することができる. +この基本を踏み外さなければ, \TeX と呼んでいいのではないだろうか. + +もともと, \TeX システムはクヌース教授が伝統的な組版について調査し, +同等以上のクオリティを得ることを目標に作られたシステムである. +\pTeX も, 従来の日本語の組版について十分調査し, +先人の行ってきた美しい組版のための工夫を, +できる限り取り込んでいきたいと考えている. +それをある程度効率よく行うためには, +やはり, \TeX の内部に変更を加える必要がある. + +今後の\pTeX の環境の整備, 機能拡張として以下のものを考えている. +\begin{description} +\item[マクロの充実]\ \\ + 縦組みに必要なマクロを洗い出し, 充実させる必要がある. + +\item[約物のチューニング]\ \\ + 現在の{\tt TFM}では, 約物(記号類)の扱いについて + チューニングの足りない部分がある. + + {\tt TFM}のチューニングで対応しきれない場合は, + \TeX 本体のスペーシングアルゴリズムに変更を + 加えなければならないかもしれない. + +\item[漢字・カナ別フォント]\ \\ + 写植にはカナ書体と言って, 漢字が含まれていない書体がある. + これと漢字の書体(明朝, ゴシックなど)とを組み合わせて文章を組む. + カナの書体を変えただけでもかなり雰囲気が変わるものである. + + これを\TeX で実現するには, カナのカレントフォントを設けて, + コードによって漢字フォントとカナフォントを使い分けることになるだろう. + +\item[ルビ]\ \\ + やはり日本語の書籍を組版するためには, ルビを避けるわけにはいかない. + + ルビの振ってあることばの途中でラインブレークが起こる場合があるので, + ラインブレーク処理に手を加えなければならない. + 縦組み拡張に匹敵する大改造になると思われる. +\end{description} + +\subsection*{謝辞} + +本研究の機会を与えてくださった +(株)\kern-3pt アスキー 電子編集研究統轄部 井芹昌信 統轄部長, +同 技術統轄部 三浦雅孝 統轄部長, +ならびに, \TeX システムについて貴重なご意見をいただいた 同 技術部 大野俊治 次長 +に感謝します. + +\begin{thebibliography}{9} +\bibitem{texbook} Knuth, D. E. : {\em The \TeX book}, Addison-Wesley (1986)\\ + [斎藤信男 監修, 鷺谷好輝 翻訳 : \TeX ブック, アスキー(1989)] +\bibitem{texweb} Knuth, D. E. : {\em \TeX : the program}, Addison-Wesley (1986) +\bibitem{jtex} 倉沢良一 : \TeX システムの日本語化, + 日本語\TeX 配布テープ, {\tt ./doc/jtex.tex} (1987) +\bibitem{jfm} 倉沢良一 : JFM file format, + 日本語\TeX 配布テープ, {\tt ./doc/jfm.tex} (1987) +\bibitem{arabic} Knuth, D. E. and MacKay, P. : + Mixing right-to-left texts with left-to-right texts, + {\em TUGboat Volume~8 No.~1}, pp.~14--25 (1987) +\end{thebibliography} + +\end{document} diff --git a/Master/texmf-dist/doc/ptex/base/ptexskip.tex b/Master/texmf-dist/doc/ptex/base/ptexskip.tex new file mode 100644 index 00000000000..c2236714b95 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/base/ptexskip.tex @@ -0,0 +1,387 @@ +\documentclass{jarticle} +\ProvidesFile{ptexskip.tex}[1997/08/08 v0.4 about pTeX skips] +\usepackage{plext} + +\title{p\TeX~2.1.5における数式の前後} +\author{中野 賢\footnote{Ken Nakano (\texttt{<ken-na at ascii.co.jp>}): + 株式会社 アスキー 出版技術部}} +\date{1997年8月8日} + +\newcommand{\hex}[1]{\hskip\xkanjiskip\texttt{"#1}} +\newcommand{\cs}[1]{\hskip\xkanjiskip\texttt{\char"5C #1}} +%\xspcode"5C=1 +\xspcode"22=2 % 2 +\xspcode"27=2 % 2 +\xspcode"5C=1 % 1 +\xspcode"60=1 % 1 +\prebreakpenalty"22=10001 % '' +\prebreakpenalty"27=10002 % ' +\postbreakpenalty"5C=10003 % ``, \ +\postbreakpenalty"60=10004 % ` + +% サンプル用 +\newdimen\dimenA + +%\tracingcommands=2 +%\tracingmacros=2 +%\tracingparagraphs=2 +%\tracingoutput=2 +\showboxbreadth=\maxdimen +\showboxdepth=\maxdimen +\nonstopmode + +\begin{document} +\maketitle + +\section*{はじめに} +p\TeX{}では、和文と欧文の間に\emph{四分アキ}と呼ばれるスペースを +自動的に挿入するようになっている。挿入される箇所は、和文と欧文の間という +だけでなく、他にも次の条件が揃っていなくてはならない。 + +\begin{itemize} +\item \cs{autoxspcode}の状態 +\item \cs{xspcode}および\cs{inhibitxspcode}による抑制を受けない +\item shift\_amount(移動量)がゼロである\cs{hbox}の直前、直後 +\item 合字、ペナルティ、ベースライン調整量、暗黙の\cs{kern}の直前、直後 +\end{itemize} + +本文では多くの場合、単純に文字が並んでいるだけなので、このような条件を +知らなくても、期待している結果を得ることができる。 +しかし、数式を組み立てた場合、自分ではとくに指定をしていなくても、 +\TeX{}が内部処理で、文字の位置を調整したり、\cs{vbox}に入れたりするために、 +四分アキが入らず、その原因もわからないということがある。 + +そこで、p\TeX~2.1.5では、テキスト数式の前後への四分アキの挿入方法を変更した。 +この文書では、その拡張に際しての仕様の変更について簡単に説明をしている。 + +\section{p\TeX~2.1.4までの数式の前後} +p\TeX~2.1.4で\footnote{より正確に言えば、p\TeX~2.1.5 $\beta$~6まで}、 +テキスト数式の前や後に四分アキが入らない主な原因は以下の3つである。 + +\begin{itemize} +\item \cs{xspcode}による影響の場合 +\item シフトされた\cs{hbox}となる場合 +\item \cs{vbox}となる場合 +\end{itemize} + +\subsection{\cs{xspcode}による影響の場合} +\cs{xspcode}および\cs{inhibitxspcode}による抑制は、たとえば、 +$\alpha$や$\beta$の前後にスペースが入らないという結果をもたらす。 +なぜならば、$\alpha$はcmmi10の\hex{0B}の位置、$\beta$は\hex{0C}の位置に +あるからである。これら文字の\cs{xspcode}の値はゼロ、すなわち前後への +四分アキを抑制するという動作をする。 +その結果、前後に四分アキが入らないのである。 + +\subsection{シフトされた\cs{hbox}となる場合} +shift\_amountがゼロでない\cs{hbox}の例としては、 +$\sum$や$\int$や$x^2$や$x_2$や$\sqrt{\hbox{Var(X)}}$などを挙げられる。 + +$\sum$はcmex10の\hex{50}の位置にあり、これはcmr10の``P''と同じ位置 +なので\cs{xspcode}による抑制は受けない。しかし、位置の調整のために、 +\cs{hbox}に入れられ、左にシフトされる。この結果、\hex{50}の文字が +一つだけにも関わらず、処理対象外の\cs{hbox}となってしまい、 +前後への四分アキが入らなくなる。$\int$も同様である。 + +$x^2$や$x_2$などの場合は、上付き/下付き文字がシフトされた\cs{hbox}として +組み立てられているので、``$x$''の前には四分アキが入るが、 +``2''の後ろには入らないことになる。 + +根号記号の場合は、全体がシフトされた\cs{hbox}として組み立てられるので、 +前後に四分アキが入らない。 + +\subsection{\cs{vbox}となる場合} +その他に四分アキが入る箇所は、 +合字、ペナルティ、ベースライン調整量、暗黙の\cs{kern}の直前か直後 +だけである。これ以外の箇所には入らない。 +数式の前後に限れば、このうちの、\cs{vbox}の前後には入らないという +制限が大きく影響をしている。たとえば、$\frac{1}{k}$といった分数や、 +$x_k^2$のように上付きと下付き文字の両方を指定したときが、これに当たる。 + +分数の場合は、最終的に\cs{vbox}として組み立てられる。 +そのため、分数の前後に四分アキが入らなくなる。 +上付きと下付きの両方がある場合は、それらが\cs{vbox}に入れられるため、 +入らなくなるのである。上付きと下付きの一方の場合と状況は異なるが、 +結果は一緒である。 + +\section{p\TeX~2.1.5 $\beta7$での数式の前後} +今までの実装コードでは、数式の開始や終了のノードを見つけても、 +開始/終了ノードを単純にスキップするだけで、その後、数式の内部の文字を見て、 +スペースを挿入するかどうかを判断をしていた。そのために数式を囲んでいる +\cs{hbox}がシフトしていたり、\cs{vbox}であったりすると前後にスペースが +入らないという結果になっていた。 + +そこで、$\beta7$では、数式の開始ノードを見つけたとき、次の要素が何で +あるかを調べることにした。 + +数式の次の要素が``文字''そのものである場合、テキストの最後の文字との関係で +適切なスペースを入れる。ここで、従来の動作と異なるのは、数式内部の文字の +\cs{xspcode}あるいは\cs{inhibitxspcode}の設定を無視するようにした点である。 +つまり、数式内の文字とその直前との文字が和文か欧文かだけを調べて、 +四分アキか漢字間スペースを挿入するようにした。 +この変更で$\alpha$や$\beta$などの文字の前にスペースが入るようになる。 + +数式の開始ノードの次の要素が文字以外の場合は、それが何であっても +四分アキを入れる。この修正によって、数式がシフトされた\cs{hbox}や +\cs{vbox}の場合であっても四分アキが入る。 +このようなボックスになるときは、上付き/下付き文字、分数、数学記号を +使った場合などである。 + +終了ノードの時点では、この後に挿入するスペースが決まっていればそれを用いる。 +すなわち、数式の最後とその後るの文字がともに和文であれば漢字間スペースを +挿入し、いずれかが欧文であれば四分アキを挿入する。 +このときも、数式内部の最後の文字の\cs{xspcode}も無視するようにし、 +$\alpha$や$\beta$などの後ろにも入るようにしている。 + +シフトされた\cs{hbox}や\cs{vbox}などで終了したときは、 +前側に四分アキを入れたので、合わせる意味で後側にも四分アキを挿入する。 +これで$x^2$や$\frac{dx}{dy}$や$\sqrt{3}$などの後ろにもスペースが入る。 + +なお、数式の直前の文字と数式内部の先頭文字がともに欧文の場合、 +あるいは数式内部の最後と数式直後がともに欧文の場合は、 +\TeX{}と同じであり特別なスペースを入れないのは従来と同じである。 + +\section{p\TeX~2.1.5 $\beta8$での数式の前後} +p\TeX~2.1.5 $\beta8$では、単純にテキスト数式の前後に四分アキを入れる方法 +で実装している。ただし、「(」や「)」などによる抑制を効かせるべき箇所には +四分アキは入らない。つまり +``\verb|($y=a+b$)|''は +``($y=a+b$)''となり +``(\kern\xkanjiskip$y=a+b$\kern\xkanjiskip)''とは +ならないことに注意する。 +`\verb|($y=a+b$)|'は +`($y=a+b$)'となり +`(\kern\xkanjiskip$y=a+b$\kern\xkanjiskip)'とは +ならないことに注意する。 +\showlists + +$\beta7$版と$\beta8$版との仕様の違いは、 +次のように数式内の文字が漢字で始まる(あるいは終わる)ときに現れる。 +\begin{verbatim} + \kanjiskip=4pt \xkanjiskip=8pt + □□$表面積=4\pi r^2$□□ +\end{verbatim} +この例をそれぞれで処理した場合、 +\begin{quote} +\kanjiskip=4pt \xkanjiskip=8pt +□□\kern\kanjiskip$表面積=4\pi r^2$\kern\xkanjiskip □□ + \quad($\beta7$\kern.25zw 版)\\ +□□\kern\xkanjiskip$表面積=4\pi r^2$\kern\xkanjiskip □□ + \quad($\beta8$\kern.25zw 版)\\ +□□$表面積=4\pi r^2$□□ + \quad\hbox{\kanjiskip=0pt\xkanjiskip=.25zw (この版)} +\end{quote} +となる。つまり、$\beta7$版では数式内部の文字と直前の文字を比較しているため、 +前側に漢字間スペースが入り、後側に四分アキが入る。 +一方、$\beta8$版では数式内部の文字に関係なく、両側に四分アキが入る。 + +なお、両者の違いは、次のように\cs{hbox}を用いたときにも現れる。 +\begin{verbatim} + \kanjiskip=4pt \xkanjiskip=8pt + □□$\hbox{表面積}$□□ +\end{verbatim} +これを処理すると、$\beta7$版は目指すべき仕様とは異なり、 +後ろに何も入らない(バグ)。$\beta8$版では仕様どおりに両側に四分アキが入る。 +\begin{quote} +\kanjiskip=4pt \xkanjiskip=8pt +□□\kern\xkanjiskip$\hbox{表面積}$\kern0pt □□ + \quad ($\beta7$\kern.25zw 版)\\ +□□\kern\kanjiskip$\hbox{表面積}$\kern\kanjiskip □□ + \quad\hbox{\kanjiskip=0pt($\beta7$\kern.25zw 版を修正した場合)}\\ +□□\kern\xkanjiskip$\hbox{表面積}$\kern\xkanjiskip □□ + \quad ($\beta8$\kern.25zw 版)\\ +□□$\hbox{表面積}$□□ + \quad\hbox{\kanjiskip=0pt\xkanjiskip=.25zw (この版)} +\end{quote} + +実際には、p\TeX, p\LaTeX のデフォルトの設定では\cs{kanjiskip}と\cs{xkanjiskip}% +の値はもっと小さいので、違いはそれほど目立たないかもしれない。 +しかし、縦組にした場合は、つぎのような結果となる。 +\begin{quote} +\begin{minipage}<t>{16zw} +△△\kern\kanjiskip$表面積=4\pi r^2$\kern\xkanjiskip\raisebox{-.25zw}{△△} + \quad($\beta7$\kern.25zw 版)\\ +\\ +△△\kern\kanjiskip$表面積=4\pi r^2$\kern\xkanjiskip △△\\ + \hfill($\beta7$\kern.25zw 版を修正した場合)\\ +\\ +△△\kern\xkanjiskip$表面積=4\pi r^2$\kern\xkanjiskip △△ + \quad($\beta8$\kern.25zw 版)\\ +\\ +△△$表面積=4\pi r^2$△△ + \quad\hbox{\kanjiskip=0pt\xkanjiskip=.25zw (この版)} +\end{minipage} +\end{quote} +$\beta7$の結果を見ると文字間のスペースは仕様どおりになっている。 +しかし、ベースラインの調整量が数式の後ろで戻っていないというバグがある。 +たとえバグを修正したとしても、決して読みやすいとは思えない。 + +以上の結果を比較すると、$\beta8$の挿入方法のほうが自然で、読みやすいように +思える。また、挿入されるスペースも前後の文字、数式内の文字に関係なく、 +四分アキと決まっているので結果がわかりやすい。 +そこで、$\beta8$では、この節の冒頭で述べた、 +\begin{center} +単純に、テキスト数式の前後に四分アキを入れる +\end{center} +という仕様で実装している。 + +\subsection{別の問題} +$\beta7$の実装では、完全に数式にだけ影響するようにしていなかったため、 +通常の文章内でのボックスに対する動作も変わってしまっていた。たとえば、 +\begin{quote} +\begin{verbatim} +□□\AA △△△△\hbox to0pt{ABC\hss}○○○○\hbox{}A\hbox{}□□□□ +\end{verbatim} +\end{quote} +が +\begin{quote} +\setbox0=\hbox{h}\dimenA=\ht0 \advance\dimenA-1ex +□□ +\leavevmode\rlap{\raise.67\dimenA\hbox{\char'27}}\kern\xkanjiskip A% +\kern\xkanjiskip △△△△ +\setbox0\hbox{ABC}\dimenA=\wd0\advance\dimenA-\xkanjiskip +\kern\xkanjiskip ABC\kern-\dimenA ○○○○ +\kern\xkanjiskip A\kern\xkanjiskip □□□□ +\end{quote} +となる。先ほどのリストを処理して期待する結果は、次のようだと思われる。 +\begin{quote} +\setbox0=\hbox{h}\dimenA=\ht0 \advance\dimenA-1ex +□□ +\kern\xkanjiskip +\leavevmode\rlap{\raise.67\dimenA\hbox{\char'27}}\kern0pt A% +\kern\xkanjiskip △△△△ +\setbox0\hbox{ABC}\dimenA=\wd0% +\kern\xkanjiskip ABC\kern-\dimenA ○○○○ +\kern0pt A\kern0pt □□□□ +\end{quote} +この版では、 +\begin{quote} +□□\AA △△△△\hbox to0pt{ABC\hss}○○○○\hbox{}A\hbox{}□□□□ +\end{quote} +となる。 +\AA の前に四分アキが入っていなければ、それはシフトされたボックスの前後に +アキが入らないからである。$\beta7$の実装で``{\char'27}''と``A''の位置が +ずれているのは、シフトされたボックスの前には入れないのは変わらないけれども、 +後ろで必ず入れないようにするのをやめたためである。 +また、$\beta7$では、ボックスの中身の最後が文字以外でも、空でも四分アキの +挿入に影響をさせないようにしていたため、幅がゼロのボックスを作成しても、 +参照点の位置が戻らないし、処理の抑制もされなくなっていた +\footnote{これらの問題は$\beta11$で修正。}。 + +\appendix +\section{自動挿入されるスペースの種類} +p\TeX{}では、日本語文書をきれいに組版するために、 +和文と和文の間、和文と欧文の間に自動的にスペースを入れるように拡張している。 +欧文と欧文の間は、\TeX{}のメカニズムそのままである。 + +和文と和文の間に入れるスペースの量は、\cs{kanjiskip}という長さレジスタに +設定をする。和文と欧文との間は\cs{xkanjiskip}という長さレジスタである。 +p\TeX{}のデフォルトでは、 +\begin{verbatim} + \kanjiskip=0pt plus .4pt minus .4pt + \xkanjiskip=.25zw plus 1pt minus 1pt +\end{verbatim} +となっている。この設定は、 +\cs{kanjiskip}は標準でゼロポイント、場合によって$\pm0.4$ポイント分だけ伸縮、 +\cs{xkanjiskip}は標準でその時点の和文フォントの幅の$1/4$、 +場合によって$\pm1$ポイント分だけ伸縮しても良いということを意味している。 + +\cs{kanjiskip}も\cs{xkanjiskip}も、段落の終わりか、\cs{hbox}の最後の時点 +の値が有効となる。したがって、ひとつの段落内や\cs{hbox}内で複数回指定を +しても、その最後の指定によって処理される。 + +ただし「、」や「(」のように、特定の文字が連続する場合、そのまま全角幅 +で並べ、間に\cs{kanjiskip}を挿入すると文字の間が離れすぎてしまう。 +このときには、\cs{kanjiskip}ではなく、JFM(Japanese Font Metric)で設定 +されているスペースの量が使われる。 + +\cs{xkanjiskip}に関しても、和文と「;」、「(」と和文、欧文と「。」、 +「…」と前後の欧文のような箇所には、スペースを挿入しないほうがきれいに +見える。そこで、特定の欧文の文字に対して、\cs{xkanjiskip}の挿入を制御 +するために\cs{xspcode}が用意されている。 +特定の和文に対しては\cs{inhibitxspcode}を用いて制御する。 + + +\section{スペースに関するプリミティブ} +p\TeX{}で拡張した、スペースに関するプリミティブは以下のとおり。 + +\subsection{\cs{kanjiskip}, \cs{autospacing}, \cs{noautospacing}} +\cs{kanjiskip}は、 +漢字と漢字の間に自動的に挿入するスペースの量を格納する長さレジスタである。 + +\cs{autospacing}と\cs{noautospacing}は、 +漢字と漢字の間にスペースを挿入するかどうかを指定するのに用いる。 +\cs{autospacing}を指定すると自動的に挿入される。 +\cs{noautospacing}を指定すると漢字間へのスペース挿入は抑制される。 + +\subsection{\cs{xkanjiskip}, \cs{autoxspacing}, \cs{noautoxspacing}} +\cs{xkanjiskip}は、 +漢字と英字の間に自動的に挿入するスペースの量を格納する長さレジスタである。 + +\cs{autoxspacing}と\cs{noautoxspacing}は、 +漢字と英字の間にスペースを挿入するかどうかを指定するのに用いる。 +\cs{autoxspacing}を指定すると自動的に挿入される。 +\cs{noautoxspacing}を指定すると漢字間へのスペース挿入は抑制される。 + +\subsection{\cs{xspcode}} +\cs{xspcode}は、指定した英字と漢字との間のスペース挿入を +どのように\textgt{許可}するかの設定をするプリミティブである。 +動作は、つぎのいずれかの数値で指定をする。 + +\begin{center} +\begin{tabular}{ll} +0 & 前後の漢字との間へのスペースの挿入を禁止する。\\ +1 & 直前の漢字との間にだけスペースの挿入を許可する。\\ +2 & 直後の漢字との間にだけスペースの挿入を許可する。\\ +3 & 前後の漢字との間にスペースの挿入を許可する。\\ +\end{tabular} +\end{center} + +初期値は、\texttt{[0-9A-Za-z]}は3、それ以外はゼロになっている。 +ただし、以下の文字については、kinsoku.texで別の値に初期化されている。 +括弧内はASCII文字コード(16進数)である。 + +\begin{center} +\begin{tabular}{l@{\hspace{2.5zw}}l@{\hspace{2.5zw}}l@{\hspace{2.5zw}}l} +\texttt{(}=1 (\hex{28}) & \texttt{)}=2 (\hex{29}) & +\texttt{[}=1 (\hex{5B}) & \texttt{]}=2 (\hex{5D})\\ +\texttt{`}=1 (\hex{60}) & \texttt{'}=2 (\hex{27}) & +\texttt{;}=2 (\hex{3B}) & \texttt{,}=2 (\hex{2C})\\ +\texttt{.}=2 (\hex{2E}) \\ +\end{tabular} +\end{center} + +ただし、\cs{xspcode}の設定は、文字コードに対してであり、フォントによって +異なる値を指定することはできない。したがって\hex{60}の位置にある文字は、 +cmr10では``\textrm{`}'', cmmi10では``$\ell$'', cmex10では``$\coprod$''で +あるが、これらの文字はすべて\cs{xspcode}=1として処理される。 + +\subsection{\cs{inhibitxspcode}} +\cs{inhibitxspcode}は、指定した漢字と英字の間のスペース挿入を +どのように\textgt{抑制}するかの設定をするプリミティブである。 +動作は、つぎのいずれかの数値で指定をする。 + +\begin{center} +\begin{tabular}{ll} +0 & 漢字と英字との間のスペースの挿入を禁止する。\\ +1 & 直前の英字との間のスペースの挿入を禁止する。\\ +2 & 直後の英字との間のスペースの挿入を禁止する。\\ +3 & 前後の英字との間のスペースの挿入を許可する。\\ +\end{tabular} +\end{center} + +初期値は、すべての漢字について3である。 +ただし、以下の文字については、kinsoku.texで別の値に初期化されている。 + +\begin{center} +\begin{tabular}{l@{\hspace{2.5zw}}l@{\hspace{2.5zw}}l@{\hspace{2.5zw}} + l@{\hspace{2.5zw}}l@{\hspace{2.5zw}}l} +、=1 & 。=1 & ,=1 & .=1 & ;=1 & ?=1\\ +(=2 & )=1 & [=2 & ]=1 & {=2 & }=1\\ +‘=2 & ’=1 & “=2 & ”=1 & 〔=2 & 〕=1\\ +<=2 & >=1 & 《=2 & 》=1 & 「=2 & 」=1\\ +『=2 & 』=1 & 【=2 & 】=1 & −=0 & 〜=0\\ +…=0 & ¥=0 & °=0 & ′=1 & ″=1\\ +\end{tabular} +\end{center} + +\end{document} diff --git a/Master/texmf-dist/doc/ptex/jvf/COPYRIGHT b/Master/texmf-dist/doc/ptex/jvf/COPYRIGHT new file mode 100644 index 00000000000..1359f564ef6 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/jvf/COPYRIGHT @@ -0,0 +1,25 @@ +Copyright (C) 1999 ASCII Corporation. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Master/texmf-dist/doc/ptex/jvf/Changes.txt b/Master/texmf-dist/doc/ptex/jvf/Changes.txt new file mode 100644 index 00000000000..0a99aaf42f9 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/jvf/Changes.txt @@ -0,0 +1,16 @@ +変更履歴 + +1.0 -> 1.1 +・ベースラインを変更するための -b オプションを追加。 +・非漢字部/漢字部を別フォントにするための -K オプションを追加。 +・長体JFMのための -C オプションを追加。 +・JFMによっては正しくVFが作成されない場合があったので、松阪大学の奥村晴彦さんの + ご協力により修正。 +・数値処理に不具合があったので、東京書籍印刷株式会社の小林肇さんのご協力により + 修正。 + +1.1 -> 1.1a +・縦書き時にクオート類をミニュートへ変更するためのオプション -m を追加 + +1.1a -> 1.1b +・配布条件等を変更、COPYRIGHT と COPYRIGHT.jis を追加。 diff --git a/Master/texmf-dist/doc/ptex/jvf/README.txt b/Master/texmf-dist/doc/ptex/jvf/README.txt new file mode 100644 index 00000000000..31f6db1c775 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/jvf/README.txt @@ -0,0 +1,125 @@ +日本語VF生成ツール makejvf ver.1.1a + 株式会社アスキー 出版技術グループ + www-ptex@ascii.co.jp + + makejvf は(株)アスキーで日本語化された dvips を使用する際に必要なVFファイルを +生成するためのツールです。 + + makejvf の使用および配布に関しては、付属の COPYRIGHT ファイルを参照してくださ +い。 + + dvips で日本語を扱う場合、DVIを作る際に使用する和文TFMに記述してある文字幅と、 +和文PSフォントの文字幅が異なるため、文字位置を調整するVF(Virtual Font)というファ +イルが必要になります。makejvf はこのVFを生成するためのツールです。 + また、縦書き時にはシングルクォート(‘’)、ダブルクォート(“”)をそれぞれシング +ルミニュート(′とこれを180度回転させたもの)とダブルミニュート(″とこれを180度回 +転させたもの)に変換して出力します。 + +---------------------------------------- +VFについて + + VF(Virtual Font)とは、フォントを合成して仮想的なフォントとして扱うためのファイ +ルです。 + 欧文フォントではアクセント記号を持たないフォントに他のフォントのアクセント記号 +を追加して1つのフォントとして扱ったり、任意のフォントの小文字部分を縮小した大文 +字に置き換えて SmallCaps フォントのように扱うのに使用します。 + VFファイルの中身はDVIファイルと似ており、各文字についての出力方法がDVI命令に +よって記述されています。文字の位置を変えることも可能です。 + dvips でのVFとTFMの関係は次のようになっています。 + + TeX がTFMを参照して組版 + ↓ + dvips がDVI中のTFMと同じ名前のVFを参照(なければ文字合成なし) + ↓ + VF中に記述されている各文字の定義(文字毎にフォントを設定できる)を参照 + ↓ + 文字定義に従って dvips が各文字を置換 + + dvipsで日本語を扱う場合、min10 や goth10 の文字位置と和文PSフォントの文字位置 +の違いが問題になります。 + 例えば "(" のような、左に空きがある括弧類の場合、和文PSフォントでは左の空きも +含んだ文字として扱いますが、min10 や goth10 では左の空きは文字として扱わず、「空 +き+"("」のような扱いになります。そのため min10 の "(" をそのままPSの "(" に置 +き換えてしまうと、想定した位置より右に出力されてしまいます。 + そこでVF中に「"(" は左にずらして置き換える」という記述をしておき、dvips がVF +を参照して位置調整を行うようになっています。 +---------------------------------------- + +コンパイルおよびインストール: + + makejvf のインストール先を Makefile の DISTDIR に指定しておいて下さい。 + make を実行すると makejvf が作られ、さらに make install を実行すると + DISTDIR で指定したディレクトリにインストールされます。 + +必要なファイル: + + min10.tfm や goth10.tfm 等、pTeXで使用する和文TFMファイル。縦書き用(tmin10.tfm +等)も扱えます。 + +使用方法: + + % makejvf <和文TFMファイル名> <和文PSフォントTFM名> + + <和文TFMファイル名>: pTeX で使用する和文TFMの名前。カレントディレクトリ + に用意しておく。この名前の拡張子を`.vf'にしたものが + VFファイルとして生成される。 + <和文PSフォントTFM名>: 実際に出力される和文PSフォントの文字幅情報を記述した + TFMの名前。makejvf により生成される。また、この名前 + がVF中に記述される。 + + オプション: + -C + 長体(左右の幅を縮めた書体)のTFMを元にVFを作成する場合に使用します。 + 長体VF作成時に-Cを付けないと、単に小さいフォントのTFMとして扱われて + しまいます。 + + -K <和文PSフォントTFM名> + 非漢字部のPSフォントTFMを指定します。これにより、1書体で漢字部と非 + 漢字部で異なるフォントが使用できます。 + + -b <数値> + ベースライン補正の数値を指定します。文字の高さを1000として整数で指定、 + プラスで文字が下がり、マイナスで文字が上がります。 + + -m + 縦書き時にクオート類(’”)をミニュート(′″)へ変換します。 + + ---以下2つは正式にサポートされているオプションではありません--- + + -a <AFMファイル名> + PSフォントのAFMファイル名を指定します。 + かな詰めフォント作成時に使用します。 + + -k <数値> + かな詰めマージンを指定します。文字幅を1000として整数で指定。 + -aオプションと共に使用します。 + +例1: min10 をリュウミン-Lとして使用する場合: + + % makejvf min10.tfm rml (min10.vf と rml.tfm が生成される) + + こうして生成されたVFおよびTFMを $TEXMF 以下の検索パスが通る場所に置きます。 +さらに、rml が出力機のリュウミン-Lであることを宣言するために、$TEXMF/dvips 以下 +にある psfonts.map に次のような記述を追加します。 + + rml Ryumin-Light-H + + これで min10 を使用した箇所が dvips によりリュウミン-Lに置きかえられます。 +Ryumin-Light-H を ShinGo-Bold-H にすれば新ゴ-Bに、FutoMinA101-Bold-H にすれば +太ミンに置きかえられます。 + このようなVFおよびTFMを多数作成することで多書体の使用が可能になります。なお、 +元になるTFMは min10.tfm を別の名前にコピーして使用します。 + +例2: 非漢字部に見出しミン、漢字部に太ゴを使用する場合: + + % makejvf -K midashimin-ma31 jcomic.tfm futogo-b + + 漫画の台詞のような、かなを明朝書体、漢字をゴシック書体で使用する例です。 +jcomic.tfm にはあらかじめ min10.tfm をコピーしておきます。psfonts.map には次の +ような記述を追加します。 + + midashimin-ma31 MidashiMin-MA31-H + futogo-b FutoGoB101-Bold-H + +これで jcomic.tfm を使用すると、生成された jcomic.vf によって非漢字部は見出しミ +ン、漢字部は太ゴで出力されます。 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} |