diff options
author | Karl Berry <karl@freefriends.org> | 2019-04-03 21:38:46 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-04-03 21:38:46 +0000 |
commit | 1c88174cd5df6c984f2846dee6a830522ccc9fbd (patch) | |
tree | 4b2812f51d1613d1119d968691257d17b4da9e87 /Master/texmf-dist/doc/ptex | |
parent | 4ae4ac1395c32920abe3434b2601bd54066707b1 (diff) |
ptex-manual (3apr19)
git-svn-id: svn://tug.org/texlive/trunk@50733 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/ptex')
21 files changed, 5917 insertions, 85 deletions
diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/LICENSE b/Master/texmf-dist/doc/ptex/ptex-manual/LICENSE index 2b8e62748f9..fb5ba975122 100644 --- a/Master/texmf-dist/doc/ptex/ptex-manual/LICENSE +++ b/Master/texmf-dist/doc/ptex/ptex-manual/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2017-2018 Japanese TeX Development Community +Copyright (C) 2017-2019 Japanese TeX Development Community All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/Makefile b/Master/texmf-dist/doc/ptex/ptex-manual/Makefile deleted file mode 100644 index 1bc580ccfb7..00000000000 --- a/Master/texmf-dist/doc/ptex/ptex-manual/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -KANJI = -kanji=utf8 -FONTMAP = -f ipaex.map -f ptex-ipaex.map - -ptex-manual.pdf: ptex-manual.tex - platex $(KANJI) ptex-manual.tex -# makeindex -s gind.ist -o ptex-manual.ind ptex-manual.idx - mendex -U -s gind.ist -o ptex-manual.ind ptex-manual.idx - platex $(KANJI) ptex-manual.tex - dvipdfmx $(FONTMAP) ptex-manual - -.PHONY: clean -clean: - rm -f *.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/README.md b/Master/texmf-dist/doc/ptex/ptex-manual/README.md index 65d265c582b..6fb6c332039 100644 --- a/Master/texmf-dist/doc/ptex/ptex-manual/README.md +++ b/Master/texmf-dist/doc/ptex/ptex-manual/README.md @@ -1,13 +1,28 @@ # ptex-manual -This is a project of preparing a manual of Japanese pTeX. +This is a project of preparing a manual of Japanese pTeX and e-pTeX. Currently only Japanese version available. -## この pTeX マニュアルについて +## Contents -[ptex-base issue #2](https://github.com/texjporg/ptex-base/issues/2) -での議論を機に,pTeX のドキュメント化を進めようという取り組みです。 -まだ作成途中ですのでご注意ください。 +The following documents are maintained by Japanese TeX Development +Community: + + * ptex-manual.pdf: The manual of pTeX. + * eptexdoc.pdf: The manual of e-pTeX. + * jfm.pdf: Specification of JFM (Japanese Font Metric) format. + +This bundle also provides some old documents, which are no longer +maintained by us: + + * jtex_asciimw.pdf: Report on Japanization of TeX. + * jtexdoc_asciimw.pdf: Documentation of ASCII Nihongo TeX. + * ptexdoc_asciimw.pdf: Application of TeX for publishing -- pTeX. + * ptexskip_asciimw.pdf: Spacing arround math equations on pTeX. + * eptex_resume.pdf: Report on development of e-pTeX. + +They are included for historical reasons only. Some descriptions +may be inconsistent with the current versions of (e-)pTeX. ## Repository @@ -21,6 +36,6 @@ the 3-clause BSD license (see [LICENSE](./LICENSE)). ## Release Date -2018-09-04 +2019-04-03 Japanese TeX Development Community diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/eptex_resume.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/eptex_resume.pdf Binary files differnew file mode 100644 index 00000000000..7a91fe6e152 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/eptex_resume.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/eptex_resume.tex b/Master/texmf-dist/doc/ptex/ptex-manual/eptex_resume.tex new file mode 100644 index 00000000000..6c808ed694b --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/eptex_resume.tex @@ -0,0 +1,1647 @@ +%#!eplatex resume.tex +\documentclass[a4j,papersize]{jsarticle} +\usepackage[all]{xy} +\usepackage{moreverb,manfnt} +\usepackage[14Q,20mm,ls175,nohiragino]{jd} +\makeatletter +\fpinit +\tracingstats=1\xspcode'134=3 +\def\JTeX{J\TeX} +\def\etrip{{\tt e-TRIP}} +\def\trip{{\tt TRIP}} +\def\mf{{\fontencoding{U}\fontfamily{manual}\selectfont METAFONT}} +\renewcommand{\section}{% + \jd@startsection{section}{1}{\z@}{\z@}{3}{1.1zh}{1zh}% + {\normalfont\LARGE\headfont\raggedright}} +\renewcommand{\subsection}{% + \jd@startsection{subsection}{2}{\z@}{\z@}{2}{1zh}{0.25zh}% + {\normalfont\large\headfont\raggedright}} +\input shl-tab +\newdimen\@baselineskip +\def\WEB{\texttt{WEB}} +\def\eTeX{$\epsilon$-\TeX}\def\pdfTeX{pdf\/\TeX} +\def\epTeX{$\epsilon$-\pTeX}\def\peTeX{pe\TeX} +\def\NTS{\leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}% + \kern-0.2emS$}\,} +\def\XeTeX{\leavevmode + \setbox0=\hbox{X\lower.5ex + \hbox{\kern-.15em\reflectbox{E}}\kern-.1667em \TeX}% + \dp0=0pt \ht0=0pt \box0 } +% ↑ http://wiki.contextgarden.net/Talk:XeTeX のを改変 + +% from etex_man.sty +\DeclareFontShape{OT1}{cmr}{bxrev}{n}{<-> xbmc10}{} % for right-to-left text +\DeclareTextFontCommand{\revrm}{\fontseries{bxrev}\fontshape{n}\selectfont} +\def\TeXXeT{\TeX-\revrm{\TeXXeTstate=1\beginR\TeX-\endR}} +\def\emph#1{{\rm\bfseries\mathversion{normal}#1}} + +\def\xymtt#1{\hbox to 0zw{\hss\texttt{#1}\hss}} +\jdAdjust +\count0=0\thispagestyle{empty} +\jdNline{16}{} +\jdNline{3}{\huge\emph{計算数学II 作業記録}} +\makeatletter +\jdNline{-1}{} +\jdNline[r]{2}{\Large 05班 ``epsilon'',北川 弘典} +\jdNline[r]{1}{\large \number\year/\two@digits\month/\two@digits\day + \space\two@digits\hour:\two@digits\minute} +\makeatother +\newpage +\tableofcontents + +\newpage +\section{注意事項} +\begin{itemize} +\item 成果物の\epTeX は\verb+http://www.ms.u-tokyo.ac.jp/~kitagawa/+で公 + 開しております. +\item 角藤さんが2007/12/30にp\TeX${}+{}$\eTeX の実験\footnote{こち + らは\peTeX と呼称.正式にはどうlogoを組むか分からないので,この表現 + で許してもらおう.pとeの位置が反対なのがおもしろいと共に幸いである + けれども,こちらの名称の由来はp(\eTeX)という実装方法であったからだ + ろう(と推測してみる).pe\TeX の登場でこちらもやる気がかき立てら + れ,\epTeX がより完成度が高いものとなりえた.}を公開されたが,これ + は本プロジェクトとは全く関係のないものである. +\item この文書は概ね着手した順番に並んでいるが,「形式化」以降は順番が + 若干入り乱れている.また後になるほど実際の作業と同時進行して書いた + 部分が多くなってくる. +\item 本文書は計算数学IIの発表に用いるには長すぎるということで,発表当日 (2/1) + に使うのは別に作ったスライドだけとした.しかし,もちろん,この文書 + は残すつもり. +\item \emph{一部のversionのAdobe Readerではヘブライ文字がちゃんとでない + ようですが,原因はまだよくわかりません.} +\item 阿部 紀行さん,角藤 亮さん,「教職男」さん,「通りすがり2」さんをは + じめとする方々に(このようなところで申し訳ないが)深くお礼を申し上 + げます. +\end{itemize} +\newpage + +\section{テーマについて} +\subsection{背景} +Knuth教授の開発された狭義の\TeX では,日本語が通らない.それを日本語に対 +応させようという試みとして,NTT \JTeX\footnote{千葉大の桜井さんがメンテ. +\verb+http://www.math.s.chiba-u.ac.jp/~sakurai/software.html+.} とアス +キーの\pTeX\footnote{\verb+http://www.ascii.co.jp/pb/ptex/+が公式ページ +である.}が有名であり, +後者の\pTeX は縦組みもできるということもあって,日本では標準的になったと +いってもよい.(狭義の)\TeX に対応する\LaTeX マクロについても,J\TeX, +\pTeX のそれぞれに対応版が存在し,接頭辞を拝借してp\LaTeX などのように呼 +ぶ. + +\eteiri + +\def\heb#1{\leavevmode\smash{\fontencoding{U}\fontfamily{heb}\selectfont #1}} +一方,それ以外の\TeX の拡張として,例えば次のようなものがある. +\begin{itemize} +\item \eTeX\ (eTeX). 各種機能が拡張されて + いる.詳細は後述. +\item $\Omega$ (Omega). \TeX をUnicodeに対応させて多言語処理を実装させたものであ + る.これに対応する\LaTeX マクロは$\Lambda$ (Lambda) と呼ばれる. +公式ページは\verb+http://omega.enstb.org/+. +\item \heb{\char'200}(Aleph). $\Omega$に\eTeX 相当の機能を取り込んだも + の.対応する\LaTeX マクロは \heb{\char'214} (Lamed) と呼ばれる. +\item \pdfTeX. \TeX\ sourceから直にpdfを作成できるようにしたもの.今は + \eTeX がベースとのこと.公式ページは +\verb+http://www.tug.org/applications/pdftex/+. +\end{itemize} + +\eteiri + +さて,\TeX はある種のプログラミング言語であり,変数,つまりレジスタも +\verb+\count+(4\,byte整数),\verb+\dimen+($2^{-16}$\,pt単位で,整数部 +14\,bit,小数部16\,bitの固定小数点数),\verb+\box+などのいくつかの種類が +あり,各種類0\,〜\,255のindex で,つまり1 種類につき256個ずつ使えるようになっ +ていて,\pTeX でもそれを引きずっている.しかし,MusiX\TeX などのような巨 +大なマクロパッケージでは,全く同じsourceでも(p\LaTeX では日本語まわりで +余計にレジスタを使うので)欧文\LaTeX では処理できるが.p\LaTeX では処理で +きないといった事態がすでに発生している.一方,前出の\eTeX による拡張では, +レジスタは各種$2^{15}$個使えるように改良されているので,拡張機能を使う状 +況では実質的には起こりえないと思ってよい.. + +\eteiri + +欧文の\LaTeX を使おうとして端末上で\verb+latex+と打つと,そこで起動する +のは元々の\TeX ではなく,大幅に機能拡張された\pdfTeX が互換モードで動い +ているという状況が最近では発生している,現に,作業を行ったPCでは\TeX\ +Live 2007という\TeX 関連のファイルをまとめたもの(\pTeX は入ってない)に, +自分で\pTeX を追加して使っているのだが,以下のように\pdfTeX が起動した. +このことから考えると,世界的には\eTeX の機能が利用できることが +当たり前になりつつあるといってもよいのかもしれない.つまり,特に,各種 +256個というレジスタの制限はもはやobsoluteになりつつあるといえるだろう. + +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + [h7k doc]$ latex + This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) + (後略) +\end{verbatim} +\end{adjustvboxheight} + +\subsection{テーマの提示} +前置きが長くなったが,以上の背景から,本班では\emph{\pTeX に$\bm +\epsilon$-\TeX の機能の一部,特にレジスタ数の話についての機能を組み込む} +ということを第1の目標とした. + +第2の目標は半分ネタである.\TeX ソース内で使用できる算術演算はすべて整数 +(と固定小数点数)の四則演算であるため,例えば3次方程式の解の近似計算などは +FortranとかCとかの他の言語でやらなければならなかった.これを\TeX の内部でで +きたら,いちいち計算用プログラムの結果を貼り付けたり\verb+\input+で読んだ +りする必要が無くて,楽になるに違いない\footnote {そう考えるのは多分僕だけ +だ.},と僕は考えたので,(速度はある程度は度外視することにして)\emph{\TeX への浮 +動小数点演算の実装}を次の目標にした\footnote{Beebe\nobreak\cite{beebe}のtitleは +Extending \TeX\ and \mf\ with Floating-Point Arithmeticであるが, +そちらは「Lua等のスクリプト言語による(IEEE 754rに基づくような) +実装」というアプローチを示しているだけである.}. + +\section{\TeX 周辺のcompile方法} +\pTeX の改造をするためには,それがどのようにcompileされているかを知らな +ければもちろんできない.僕は昔から\TeX 関係のプログラムを自分でソースか +らコンパイルしていた(Unix系統なら土村さんによるptetex3のおかげで,だい +ぶ簡単になった)ので知っていたのでこれを調べる時間はほとんど0で済んだ. + +\TeX の一番元々のソースは{\tt tex.web}というファイルであり,はっきり冒頭 +に +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + % This program is copyright (C) 1982 by D. E. Knuth; all rights are reserved. + % Copying of this file is authorized only if (1) you are D. E. Knuth, or if + % (2) you make absolutely no changes to your copy. (The WEB system provides + % for alterations via an auxiliary file; the master file should stay intact.) + % See Appendix H of the WEB manual for hints on how to install this program. + % And see Appendix A of the TRIP manual for details about how to validate it. + + % TeX is a trademark of the American Mathematical Society. + % METAFONT is a trademark of Addison-Wesley Publishing Company. +\end{verbatim} +\end{adjustvboxheight} +\noindent とあるように,これがKnuth教授の製作したファイルそのままである.このファ +イルは\WEB という言語/書式で書かれている. + +\subsection{\WEB の説明} +ここについては松山\nobreak\cite{matsu3}を読んだ方が, +以下の僕の下手な説明よりわかりやすいかもしれないが,まあ,お付き合いくだ +さい. + +\WEB の詳細はKnuth~\cite{webman}とか +から得られるが,大雑把に言うと,Pascalでかかれたプログラムのソースを小さ +く分割して,各分割の断片は\TeX ソースによ +る説明文を必要なら付属させて,それらを(ほとんど任意の順序で)並べたもの +である. +上の説明では非常にわかりにくいので,実例を別に挙げるこおにしておこう(付 +録参照). +\eteiri + +さて,\WEB で書かれたファイル(例えば\verb+fuga.web+)を\verb+tangle+とい +うプログラムに通すと,そこからPascalで書かれたプログラムのソースだけが抜 +き出され,\verb+fuga.pas+とか\verb+fuga.p+ができる.一方で,\verb+weave+ +というプログラムに通すと,\verb+fuga.web+中に書かれた解説文がPascalソー +スとともに整形され,\TeX ソース\verb+fuga.tex+を得る.これを\TeX で処理 +すると,綺麗に整形されたソース付きのドキュメントが得られる,という寸法で +ある\footnote{ちなみに,tangleは「もつれる/させる」,weave /w\'i:v/は「織る」と +いう意味である.{\tt tangle}は\WEB ソース中に適当な順序で置かれたプログラ +ムの各断片をちゃんと並べ直すが,吐かれたPascalソースは読もうとする気が失せ +るほどぐちゃぐちゃである.}. + +また,\WEB にはchange fileという機能が用意されており,ちょうどパッチファイ +ルの役割を果たす.構造も似ており,\newpage +\begin{adjustvboxheight} +\narrowbaselines +\begin{verbatim} + @x + 変更前の部分 + @y + 変更後の部分 + @z +\end{verbatim} +\end{adjustvboxheight} +\noindent の繰り返しからなっている.\verb+@x+の行が\verb+@x l.1701 hogehoge...+など +のようになっている(注釈が書かれている)ことも多い.{\tt tangle}や{\tt +weave}の引数にはこのchange fileを\WEB ソースとともに指定することができて, +例えば,\par +\noindent \ \ \ \ {\tt >\ tangle fuga.web fuga.ch} + +\noindent とすると,{\tt fuga.web}の内容を{\tt +fuga.ch}でパッチしたものについて,{\tt tangle}処理が行われる.また,{\tt +tie}というプログラムを使えば,\WEB ソースとchange fileから,change file適 +用後の\WEB ソースを作ったり,複数のchange fileをまとめることができる +\footnote{厳密には,これは{\tt CWEB}のプログラムらしい.名前の由来は英単 +語が「結ぶ」という意味だからであろう.Star Warsの某帝国軍戦闘機とは関係は +ないだろう.}. + +\subsection{Web2Cと\TeX のコンパイル} + +さて,{\tt tangle}で{\tt tex.web}を処理すると{\tt tex.p}が生成されるが, +現在はWeb2Cという実装方法でこれを処理している.詳細は松山\nobreak\cite{matsu3} +に譲るが,{\tt tex.web}に{\tt tex.ch}というWeb2C実装特有の拡張やシス +テム依存部分(入出力とか,時計)を納めたパッチを適用して,それを{\tt +tangle}にかけて{\tt tex.p}を生成する.その後,{\tt web2c}というプログラ +ム(と付属する小ツール)によって,{\tt tex.p}は{\tt texini.c}, {\tt +tex0.c},~$\ldots$というCソースにまで変換される.それらと(もともとCソー +スで準備されているシステム依存部分である){\tt texextra.c}とかをコンパイ +ル,リンクして,ようやく実行可能形式が出来上がるというわけである. + +これを図にしてみよう: +\jdAline[c]{\small\narrowbaselines\xymatrix{% +\texttt{tex.web}\ar[r]&\fbox{\tt tangle}\ar[r]&\texttt{tex.p}\ar[rr]^-{\rm +Web2C}&&\text{C source}\ar[rr]^-{\rm C\ compiler}&&\texttt{tex}\\ +&\texttt{tex.ch}\ar[u]}} + +同様に,\pTeX のコンパイルは次のように行われる\footnote{最後のC +compiler のところは省略した.また,厳密には{\tt ptex-base.ch}と{\tt +ptex.web}から{\tt ptex.ch}を作り,それを適用して{\tt tangle}に食わせてい +るが,そこら辺は省略.}: + +\jdAline[c]{\small\narrowbaselines\xymatrix{\texttt{% +tex.web}\ar[r]&\fbox{\tt tie}\ar[r]&\texttt{ptex.web}^*\ar[r]&\fbox{\tt +tangle}\ar[r]&\texttt{ptex.p}^* \ar[rr]^-{\rm Web2C}&&\text{C source}\\ +&\texttt{tex.ch}\ar[u]&&\texttt{ptex-base.ch}^*\ar[u] }} + +さらに,今回の準主役とも言える\eTeX では,こうなっている: +\jdAline[c]{\small\narrowbaselines\xymatrix{ {\tt +tex.web}\ar[r]&\fbox{\tt tie}\ar[r]&\texttt{etex.web}\ar[r]&\fbox{\tt +tangle}\ar[r]&\texttt{etex.p} \ar[rr]^-{\rm Web2C}&&\text{C source}\\ +{\begin{array}{c}\texttt{etex.ch}^{\dagger}\\{\tt +etex.fix}^{\dagger}\end{array}}\ar[ur] &{\begin{array}{c}{\tt +tex.ch0}^{\dagger}\\\texttt{tex.ch}\\\texttt{tex.ch1}^{\dagger}\\{\tt +tex.ech}^{\dagger}\\(\texttt{etex.web})\end{array}}\ar[r] &\fbox{\tt +tie}\ar[r]&\texttt{etex.ch}\ar[u] }} + +ここで,$*$, $\dagger$とかはファイルのあるディレクトリを表している.なお, +{\tt etex.fix}は実際には中身はなかった. + +\newpage +ここから,第1の目標,つまり\pTeX に\eTeX の機能の一部をマージ +すること,を実現させるためには,大雑把に言えば,${\tt tex.web}+{\tt +tex.ch}+\text{\tt ptex-bash.ch}^*+{\tt etex.ch}^{\dagger}$とするか,${\tt +tex.web}+{\tt tex.ch}+{\tt etex.ch}^{\dagger}+\text{\tt ptex-bash.ch}^*$と +(ここでの加法はもちろん非可換である!)すればよいだろう,と想像がつく. +どちらを選んでもよかったが,ここでは\pTeX をベースとしたいという意味で, +前者を採用することにした\footnote{これによりproject名が\emph{$\bm +\epsilon$-\pTeX}と決まった.$\varepsilon$-(\pTeX)のつもりであ +る.もちろんこの文書も\epTeX +で組版している.}. + +\section{$\bm \epsilon$-\TeX のマージ} +\subsection{\pTeX の準備} + +というわけで,主に編集するのは{\tt etex.ch}である. +しかし,\pTeX を元に作業をするので,\pTeX がコンパイルできることを確かめ +ておかねばならない.その手順は大まかには\TeX wiki~\cite{texwiki}の後 +半部にある「古い情報」にある通りである.しかし,te\TeX\ 3.0下では無事にあ +るようにコンパイルができるのだが,\TeX\ live 2007だとWeb2Cのバージョンが +新しく,途中で以下のようなエラーを出して止まってしまった: +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + gcc -DHAVE_CONFIG_H -I. -I.. -I../.. -I../.. -O2 -s -march=pentium-m -fomit-f + rame-pointer -c ptexextra.c -o ptexextra.o + ptexextra.c: In function 'parse_options': + ptexextra.c:956: error: too few arguments to function 'printversionandexit' + ptexextra.c: In function 'getjobname': + ptexextra.c:1722: error: number of arguments doesn't match prototype + texcoerce.h:908: error: prototype declaration + make: *** [ptexextra.o] Error 1 +\end{verbatim} +\end{adjustvboxheight} +これは{\tt printversionandexit}関数と{\tt getjobname}関数の宣言がWeb2Cの +version upに伴って変わってしまったのが原因である.修正箇所は +{\tt ptex756.diff}にdiffの形で書いている. +また,{\tt tftopl}とかについては{\tt tangle}の段階でエラーが出るようであ +るが,これらは本projectと関係ないので省略する: +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + This is TIE, CWEB Version 2.4. (Web2C 7.5.6) + Copyright (c) 1989,1992 by THD/ITI. All rights reserved. + (../tftopl.web) + (../tftopl.ch) + ....500....1000....1500 + (No errors were found.) + ../tangle ./tftopl.web tftopl.ch + This is TANGLE, Version 4.5 (Web2C 7.5.6) + *1*6*18*26*44*88*96*100 + ! Hmm... 1 of the preceding lines failed to match. (change file l.378) + @y + *114*126 + Writing the output file.....500.. + Done. + (Pardon me, but I think I spotted something wrong.) + make: *** [tftopl.p] Error 1 +\end{verbatim} +\end{adjustvboxheight} + +さて,とりあえずのたたき台として\pTeX の\WEB ソース,つまり{\tt +tex.web}, {\tt tex.ch}, {\tt ptex-base.ch}を1つにまとめた{\tt +ptex-orig.web}を{\tt tie}によって作成した.その後,{\tt ptex-orig.web}中 +の最初の部分である「{\tt This is TeX}」の部分などを若干修正した.修正箇所は +diffの形で{\tt ptex-orig.diff}としてある. + +\subsection{$\bm\epsilon$-\TeX の機能} +\eTeX のマニュアル\nobreak\cite{etexman}を元に\eTeX の主な機能を見てみることにする. +\eTeX にはCompatibility modeとExtended modeの2つが存在し,前者では\eTeX +特有の拡張は無効になるのでつまらない.後者がおもしろい. + +拡張機能を使うに\xspcode`*=3\xspcode`-=3{}はファイル名を渡すときに{\tt *} +をつけるかコマンドラインオプションとして{\tt -etex}スイッチをつければいい +が,\eTeX 拡張に関わる追加マクロ\footnote{例えば,\TeX ではレジスタに +\verb+\@tempcnta+などの「別 +名」をつけることが非常によくある.この機能については我々が実際に使うのははplainマクロや +\LaTeX マクロによって提供されており,当然256個制限の環境下を前提として組 +まれている.}は当然ながらそれだけで +は駄目である.「plainマクロ for \eTeX」({\tt etex.fmt}というのが一番マシ +かな)では自動的に追加マクロである{\tt etex.src}が呼ばれる.\LaTeX 下では +ちょうど{\tt etex.src}に対応した{\tt etex} パッケージを読み込む必要がある. + +\paragraph{レジスタの増加} +最初に述べたように,\TeX では6種類のレジスタが各256個ずつ利用できる.そ +れぞれのレジスタには\verb+\dimen75+などのように0\,〜\,255の番号で指定できる +他,予め別名の定義をしておけばそれによって指定することもでき +る\makeatletter\advance\c@footnote-1\footnotemark\makeatother. +これらのいくつかは特殊な用途に用いられる(例えば +\verb+\count0+はページ番号などのように)ことになっているので,さらにuser +が使えるレジスタは減少する. + +\eTeX では,追加のレジスタとして番号で言うと256\,〜\,32767が使用できるように +なった.上のpdfによると最初の0\,〜\,255と違って若干の制限はあるようだが,そ +れは些細な話である.追加された(各種類あたり)$32768-256=32512$個のレジ +スタは,メモリの効率を重視するためsparse registerとして,つまり,必要な時に始めてツリー構造の中で確保 +されるようになっている. + +\paragraph{式が使用可能に} +\TeX における数量の計算は充実しているとは言い難い.例えば, + + \verb+\dimen123+${}\leftarrow($\verb+\dimen42+${}+{}$\verb+\@tempdima+ +$)/2$ + +\noindent という計算を元々の\TeX で書こうとすると, +\begin{verbatim} + \dimen123=\dimen42 \advance\dimen123 by \@tempdima \dimen123=0.5\@tempdima +\end{verbatim} +のように書かないといけない.代入,加算代入,乗算代入,除算代入ぐらいしか +演算が用意されていない状態になっている(上のコードのように,$d_2\mathrel{+\!\!=} +0.8 d_1$というような定数倍を冠することは平気). + +\eTeX では,そのレジスタの演算に,他のプログラミング言語で使われているような数式の表現が使えるようになった.上のPDFでは実例として +\begin{verbatim} + \ifdim \dimexpr (2pt-5pt)*\numexpr 3-3*13/5\relax + 34pt/2<\wd20 +\end{verbatim} +が書かれている.これは,\def\mpt{\,\mathrm{pt}} +\[ + 32\mpt=(2\mpt-5\mpt)\left(3-\mathop{\mathrm{div}}(3\cdot 13,5)\right) ++\frac{34\mpt}{2}<\text{{\tt \char'134 box20}の幅} +\] +が真か偽かを判定していることになる\footnote{divは整数除算を表したつもり +である.整数除算は余りが被除数の符号と等しくなるように計算される.}. + +\newpage +\paragraph{{\tt\char'134 middle} primitive} +\TeX に\verb+\left+, \verb+\right+というprimitiveがあり,それを使えば括 +弧の大きさが自動調整されるのはよく知られている.\eTeX では, +さらに\verb+\middle+ primitiveが追加された. + +具体例を述べる. +\def\set#1#2{\setbox0=\hbox{$\displaystyle #1,#2$}% +\left\{\, \vphantom{\copy0}#1 \,\right|\!\left.\, \vphantom{\copy0}#2 \,\right\}} +\def\eset#1#2{\left\{\, #1 \,\middle|\, #2 \,\right\}} +\[ \set{n+\frac12}{n\in \omega} \eset{n+\frac12}{n\in \omega} \] + +これは以下のsourceで出力したものである: +\begin{adjustvboxheight} +\narrowbaselines +\begin{verbatim} + \def\set#1#2{\setbox0=\hbox{$\displaystyle #1,#2$}% + \left\{\, \vphantom{\copy0}#1 \,\right|\!\left.\, \vphantom{\copy0}#2 \,\right\}} + \def\eset#1#2{\left\{\, #1 \,\middle|\, #2 \,\right\}} + \[ \set{n+\frac12}{n\in \omega} \eset{n+\frac12}{n\in \omega} \] +\end{verbatim} +\end{adjustvboxheight} + +両方とも集合の表記を行うコマンドである.\TeX 流の\verb+\set+では2つの +\verb+\left+, \verb+\right+の組で実現させなければならず,そのために$|$の +左側と右側に入る式の最大寸法を測定するという面倒な方法を使っている.その +上,この定義では\verb+\textstyle+以下の数式(文章中の数式とか)ではそのま +ま使えず,それにも対応させようとすると面倒になる.一方,\eTeX 流の +\verb+\eset+では,何も考えずに +\verb+\left+, \verb+\middle+, \verb+\right+だけで実現できる. + +\paragraph{\TeXXeT\ \rm({\tt TeX-{}-XeT})} +left-to-rightとright-to-leftを混植できるという機能であるらしい. +ヘブライ語あたりの組版に使えるらしいが,よく知らない. +ここでのRtoLはLtoRに組んだものを逆順にしているだけのような +気がする. +%\footnote{例えば{\TeXXeTstate=1\beginR ``Tea, Earl Grey, +%hot.''\endR}のように.}. +\eteiri + +とりあえず一目につきそうな拡張機能といったらこれぐらいだろうか.他にも +tracing機能や条件判断文の強化などあるが,そこら辺はパッとしないのでここ +で紹介するのは省略することにしよう. + +この中で,\TeXXeT 機能だけは,「\TeX から\pTeX への変更部分とかちあって, +作業に非常に手間がかかる」と予想した(根拠はなし.あえて言えば勘).それ +に,僕は右→左の言語をアラビア語やヘブライ語ぐらいしか知らず,これらは +Arab\TeX などを使うことで\pLaTeX でも入力できるので,ひとまず\TeXXeT 機能だ +けは実装を見送り\footnote{目次からも分かる通り,最終的には実装することに +なるが.},他はできる限り実装することにした. + +\subsection{{\tt etex.ch}の改変} +ここから実際の作業であり,ひどく退屈な作業である. +まず{\tt etex.ch}先頭の著作権等に関する部分を +書き換えておく. + +{\tt etex.ch}中の{\tt @x ... @y ... @z}のところにはありがたいことにコメ +ントがついていて,どういう理由でパッチが当たるのかと,当たる行番号までわ +かるようになっている\footnote{但し,ここに書かれている行番号は{\tt +tex.web}に対してのそれであろう.しかし{\tt ptex-orig.web}でもあまり行番 +号は変わらない.}.次は{\tt etex.ch}の抜粋である: +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + %--------------------------------------- + @x [15] m.208 l.4087 - e-TeX saved_items + @d un_vbox=24 {unglue a box ( \.{\\unvbox}, \.{\\unvcopy} )} + @y + @d un_vbox=24 {unglue a box ( \.{\\unvbox}, \.{\\unvcopy} )} + {( or \.{\\pagediscards}, \.{\\splitdiscards} )} + @z + %--------------------------------------- + @x [15] m.208 l.4097 - e-TeX TeXXeT + @d valign=33 {vertical table alignment ( \.{\\valign} )} + @y + @d valign=33 {vertical table alignment ( \.{\\valign} )} + {or text direction directives ( \.{\\beginL}, etc.~)} + @z + %--------------------------------------- + @x [15] m.208 l.4113 - e-TeX middle + @d left_right=49 {variable delimiter ( \.{\\left}, \.{\\right} )} + @y + @d left_right=49 {variable delimiter ( \.{\\left}, \.{\\right} )} + {( or \.{\\middle} )} + @z +%--------------------------------------- +\end{verbatim} +\end{adjustvboxheight} + +\TeXXeT 機能の実装はとりあえず見送ったと書いたので, +上で言うところの{\tt e-TeX TeXXeT}などとコメントが振られている部分をバッサリ +削除するとともに,{\tt ptex-orig.web}にそのまま{\tt etex.ch}が適用できな +いところを調べ,{\tt tex.web}と{\tt ptex-orig.web}も見ながら修正していく. +\eTeX 拡張の本質的な部分は,(\pTeX でもそうだったが){\tt etex.ch}の後 +半部の以下の部分に集中して現れるので,そこでも +\TeXXeT 関連と思われる場所を削除した. +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + %--------------------------------------- + @x [54] m.1379 l.24945 - e-TeX additions + @* \[54] System-dependent changes. + @y + @* \[53a] The extended features of \eTeX. + (中略) + @* \[54] System-dependent changes. + @z + %--------------------------------------- +\end{verbatim} +\end{adjustvboxheight} + +削除しすぎたような場合は{\tt tangle}時に警告メッセージが表示される(断片 +が欠けていた場合)か,C sourceのコンパイルでエラーが出るので,退屈ではあっ +たが,そんなに厳しくは無かった. + +なお,{\tt ptex-orig.web}にそのまま{\tt etex.ch}が適用できな +いところを調べるのは簡単である.そのようなところがあった場合,{\tt +tie}で適用後の\WEB ソースを作ろうとすると,以下のようなメッセージが表示 +されるからである. +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + [h7k eptex]$ tie -m ep.web ptex-orig.web ../etexdir/etex.ch + This is TIE, CWEB Version 2.4. (Web2C 7.5.6) + Copyright (c) 1989,1992 by THD/ITI. All rights reserved. + (ptex-orig.web) + (../etexdir/etex.ch) + ....500....1000....1500....2000....2500....3000....3500....4000....4500....5000. + ...5500....6000....6500....7000....7500....8000....8500....9000....9500....10000 + ....10500....11000....11500....12000....12500....13000....13500....14000....1450 + 0....15000....15500....16000....16500....17000....17500....18000....18500....190 + 00....19500....20000....20500....21000....21500....22000....22500....23000....23 + 500....24000....24500....25000....25500....26000....26500....27000....27500....2 + 8000....28500.. + ! Change file entry did not match (file ../etexdir/etex.ch, l.200). + + (Pardon me, but I think I spotted something wrong..) +\end{verbatim} +\end{adjustvboxheight} +ちょっとずつ{\tt etex.ch}を改変するごとに上のようなコマンドを走らせれば, +次に修正するべき場所がわかるという話である. + +\subsection{\trip\ test, \etrip\ test} +\trip\ testとは,Knuth教授による\TeX のdebugの補助ツールである.これは\TeX +のソースコードの全部分を渡るように作られたテスト入力であり,大量のlogを +出力する.一度自分の計算機で\trip\ testを行い,その結果が「正しい」出力と +異なっていたなら,それはどこかにbugが潜んでいるに違いないということを意 +味する.Knuth教授自身も,Knuth~\cite{trip}の中で以下のように述べている. +\begin{adjustvboxheight} +\narrowbaselines\begin{indented}{2zw} +If somebody claims to have a correct implementation of \TeX, I will not +believe it until I see that {\tt TRIP.TEX} is translated properly. +I propose, in fact, that a program must meet two criteria before it +can justifiably be called \TeX: (1)~The person who wrote it must be +happy with the way it works at his or her installation; and (2)~the +program must produce the correct results from {\tt TRIP.TEX}. +\end{indented} +\end{adjustvboxheight} +その意味では,p\TeX の段階でももはや\trip\ testはパスしない.\TeX で出ていた\\ + \verb+! Bad character code (256).+\\ +というerrorはもはや出ないし,内部モー +ドが出力される所でもいちいち\verb+yoko direction+などが出力される.しか +し我々は\pTeX をベースとしているので,\epTeX の動作をチェックするという +今の文脈では.\pTeX による出力を\trip\ testの「正しい」出力と +考えてもよいだろう. + +\eteiri さらに,今回は\eTeX の機能も組み込んでいるのだから,\eTeX による +\trip\ testの出力とも比較する必要があった.Extended mode +の出力は当然\TeX による\trip\ testの +出力とは異なる.幸い,その内容は文献\nobreak\cite{etrip}に記述されている.また, +\eTeX では,\eTeX 特有の拡張機能をテストするための,同様の +\etrip\ testというものが別に用意されている. + +\eteiri ひとまず\TeXXeT 以外を追加した\epTeX により\trip, \etrip\ testを +行わせてみた.出力結果 +は,\pTeX による結果とも\eTeX による結果とも若干異なっていたが,その差異 +は,\TeX${}\to{}$\pTeX による出力結果の差異と\TeX${}\to{}$\eTeX による出 +力結果の差意を合わせたものでしかない.また,\epTeX による\etrip\ testの結 +果は\eTeX のそれと大きく異なるが,それは「\epTeX が\TeXXeT を実装していな +いことによるもの」「\pTeX に合うように{\tt etex.ch}を変更したことによる, +内部パラメタの若干の変更」「\pTeX の機能による,\verb+yoko direction+とか +の追加出力など」がほとんどであり,十分に予測ができたものであった.その意 +味では,(日本語処理以外には)criticalなbugはこの時点でなかったと言ってい +いだろう\footnote{なお,第6章でさらなる\trip, \etrip\ testをパスさせるた +めのdebugを行っている.}. + +この\trip, \etrip\ testは,実際に\epTeX のdebugに役に立った.11/1 +近傍で,すでに「通常のソースファイルを入力しても出力は同じ」状況にはなっ +ていた.しかし,\trip\ testをかけると,異常なpenalty値\footnote{penalty +(罰金)とは,改行/改ページの制御に使われる量であって,box, glueとともに +\TeX での組版において重要な役割を果たしている.}の出力が見られた. +そこで,\eTeX によるpenalty拡張を\epTeX に実装するところにbugが埋まっていると見 +当を付けて,そこを見直した結果,\verb+etexdir/etex.ch+(つまり,もともと +の\TeX${}\to{}$\eTeX のchange file)にある2箇所の修正箇所が,\epTeX 用の +\verb+etex.ch+には何故か抜け落ちていたことが分かり,この\epTeX のbugを修正す +ることができたのである. + +\eteiri +なお,この時点でも\epTeX は\eTeX の\TeXXeT 以外の全ての機能を実装してい +たことを注意しておこう. +\newpage +\section{浮動小数点演算の実装} +もう一つのテーマの柱,浮動小数点演算の実装に入ろう. + +まず,サポートする精度についてであるが,計算速度から言えば4\,byteの所謂 +「単精度」が良く,コードも簡単になる.しかし単精度は有効桁数が7桁前後しか +ない.しかし,実際の数値計算では,この7桁程度の精度では不足し,倍精度以上 +が使われる場合が多いと思われる.浮動小数点演算の実装の目的が「\TeX に数値 +計算をやらせる」ことであるので,倍精度以上は必須である. + +\subsection{基本方針} +何よりも,\TeX の既存部分の\WEB ソースを改変するところを最小限に留めることを最 +優先にした.使い勝手から言えば,新しいレジスタの種類を(例えば +\verb+\real+とかいう名前で)定義して,他のレジスタと同様に扱えるようにし +たほうがよいのだが,それは\TeX の内部処理を大きく変更することとなり,bug +も混じる可能性も増える. + +\eteiri +ここで,\TeX の数量にまつわるレジスタの種類を思い出そう: +\begin{itemize} +\item \verb+\count+:$-2147483647$から$+2147483647$までの整数 (number) を格納する. +\item \verb+\dimen+:$1$\,sp${}=2^{-16}$\,ptを刻み幅として,絶対値が + $2^{30}$\,sp${}=16384$\,pt より小さい長さ (dimension) を格納する. +\item \verb+\skip+:いわゆるglue.自然長 (width part),伸び量 + (stretch part),縮み量 (shrink part)を持っており,後者2つは無限大も + 指定できる(しかもその無限大にはrank があったりする). +\item \verb+\muskip+:数式モードでの\verb+\skip+に相当する. +\end{itemize} +前者2つは内部でも4\,byteであり,後者2つは4\,byte変数3つ分を記憶領域 +として使っている.\TeX のソースを見ると,レジスタがこれら(と +\verb+\toks+, \verb+\box+)だけであることに依存したコードが書かれていたの +で,新たに浮動小数点数用のレジスタと専用の記憶領域を確保したりするのは労 +力がかかるだけだと判断した.そのように考えてみると,\verb+\skip+が +12\,byte以上を使っていることになる. + +\eteiri +すると,1つのglueに浮動小数点数1つを納めるようにするのが楽である.せっか +く12\,byteあるのに8\,byte分しか使わないのは勿体ないので,12\,byte分にでき +る限り収まる限りの精度とすることにした.なお,Web2Cでサポートされている +Pascalの機能は限定的なものであるので,Pascal規格内にある浮動小数点演算の +サポートについても不安である.そこで,ここでは\emph{整数演算のみを用いて実装}す +ることとした.そのため,仮数部の演算は本質的には多 +倍長整数の演算であるので速度は非常に遅いことを覚悟しなければならない.. + +\eteiri +高レベルな機能は\TeX のマクロ機能を使い実装することを考えると,とりあえ +ず実装すべき機能として,以下を決めた: +\begin{itemize} +\item 浮動小数点定数値を表現するglueを返す:\verb+\real+\footnote{他のコ + マンドがfpを接頭辞にしているのにこれだけそうじゃないのは変かもしれ + ないが,かといって\verb+\fp+にするのは短すぎる気がするし,演算コマ + ンド側を\verb+\realadd+などとすると長すぎると思ったからである.当 + 然ながら,Fortranの{\tt REAL*}\hskip0.1zw$x$が根底にある.}. +\item 2項演算:\verb+\fpadd+, \verb+\fpsub+, \verb+\fpmul+, + \verb+\fpdiv+, \verb+\fppow+.結果は第1引数のレジスタに上書き. +\item 単項演算:\verb+\fpneg+,その他初等関数達. +\item 浮動小数点数の出力,及び型変換. +\end{itemize} +\newpage +格納形式は色々と悩んだが,最終的には以下に述べるように落ち着いた.2進で +格納すると基数変換とかいう変なものを組む必要がある\footnote{もちろん +debug時であっても.僕は暗算は異常に弱いし.}ので,10進で行った.但し指数 +部については諸事情により$16$\,bit分としている. +\jdAline[c](1){\unitlength=5mm +\begin{picture}(30,2) +\put(0,0){\line(0,1){1.5}} +\put(0,0){\line(1,0){30}} +\put(10,0){\line(0,1){1.5}} +\put(20,0){\line(0,1){1.5}} +\put(30,0){\line(0,1){1.5}} +\put(0,1){\line(1,0){30}} + +\put(7,0){\line(0,1){1}} +\put(2,0){\line(0,1){1}} +\put(1,0){\line(0,1){1}} +\put(11,0){\line(0,1){1}} +\put(21,0){\line(0,1){1}} + +\put(8.5,0.5){\line(0,-1)1} +\put(8.5,-0.6){\makebox(0,0)[t]{\small $A_1$ (3)}} +\put(1.5,0.5){\line(0,-1)1} +\put(1.5,-0.6){\makebox(0,0)[t]{\small $F$}} +\put(4.5,0.5){\line(0,-1)1} +\put(4.5,-0.6){\makebox(0,0)[t]{\small $E$}} +\put(15.5,0.5){\line(0,-1)1} +\put(15.5,-0.6){\makebox(0,0)[t]{\small $A_2$ (9)}} +\put(25.5,0.5){\line(0,-1)1} +\put(25.5,-0.6){\makebox(0,0)[t]{\small $A_3$ (9)}} + +\put(0,1){\line(1,-1){1}} +\put(0,0){\line(1,1){1}} +\put(10,1){\line(1,-1)1} +\put(10,0){\line(1,1)1} +\put(20,1){\line(1,-1)1} +\put(20,0){\line(1,1)1} + +\put(5,1.25){\makebox(0,0)[b]{\small width part}} +\put(15,1.25){\makebox(0,0)[b]{\small stretch part}} +\put(25,1.25){\makebox(0,0)[b]{\small shrink part}} + +\end{picture}} +\eteiri +一つのglueの自然長,伸び量,縮み量は\TeX 内部ではそれぞれ32\,bit整数とし +て扱われている.これらをこの順に並べて,1つの96\,bit領域とみなし +て書いたのが上の図である. +\begin{enumerate} +\item 各32\,bit部分では上位2\,bitは未使用とする\footnote{dimensionの表現 + では最上位bitは符号,次のbitはOverflow検出用のような意味を持ってい + る.そのため,これらの2\,bitも使ってしまうと何かと面倒になるように + 思われた.}.そ + れぞれの残り30\,bitで10進9桁を格納する. +\item 仮数部は図の$A_1$, $A_2$, $A_3$で示した領域とする.これらの後ろに()でく + くった数字はそこの10進での桁数を表す.合計で10進21 + 桁分の領域となり,(図の)左側を上位として21桁を格納する.小数点が + $A_1$での100の位と10の位の間に来た状態を「正規化されている」と称する. +\item 指数部は$E$で示した部分で,2進数で16\,bit分の領域をもっている.ここ + には実際の指数($-32767$--$32767$)を32767をバイアスした値が格 + 納される.但し,この$E$の値が65535のときは,(正負の)無限大として + 扱う. +\item $F$で表した部分は0, 1, 2のどれかが格納され,符号bitとしての役割を持つ. + 0は正,1は負,2はNaNを表す. +\item 以上の説明では見にくいので,このglueが表現している値を述べると,以下のよ + うになる. +\[ + \begin{cases} +(1-2F)(10^{18}A_1+10^9A_2+A_3)\cdot 10^{E-32767-20}, +&{\rm if}\ F\neq2;\\ +{\rm NaN},&{\rm if}\ F=2. +\end{cases} +\] +また,width partに実際に格納されている値は$1000(E+65536F)+A_0$である. + +\end{enumerate} + +\TeX ソース中での浮動小数点数の表記は,他のプログラミング言語でもよく用い +られているごく普通の表記を採用するが\footnote{Fortranでは指数部に{\tt +D}や時には{\tt Q}などを許容したりしているけれども,それらは\epTeX では認 +めない.},\TeX 本来の読み取りルーチンを一部流 +用した部分があるため,小数点は大陸式の`,'も認め,符号は複数あってもいい +(その場合,実際の符号は全部掛けたものになる)ことになった. + +\subsection{内部表現と四則演算} +実際の演算をglueに「パックされた」状態で行うのは余り良くないように感じた. +なぜなら,初等関数の実装を最初から念頭に置いていたが,それを21桁精度のままで計算す +るのは精度の面で非常に不安だったからである. +そうすると,内部での計算の実装は,21桁とは限らない任意長\footnote{とは +いっても,さすがに数千桁とか数万桁とかはたかが21桁の計算の内部処理として +はしないだろう.個人的には60桁もあれば十分と感じている.}の計算に対応で +きるようにした方がよい. + +上を考慮に入れて,浮動小数の内部表現である4\,byte整数型の配列$q$を以下 +のように定める: +\jdAline[c]{\unitlength=5mm +\begin{picture}(30,2) +\put(0,0){\line(1,0){15}} +\put(20,0){\line(1,0){10}} +\put(0,1){\line(1,0){15}} +\put(20,1){\line(1,0){10}} +\put(0,0){\line(0,1){1.5}} +\put(2.5,0){\line(0,1){1}} +\put(5,0){\line(0,1){1.5}} +\put(10,0){\line(0,1){1.5}} +\put(15,0){\line(0,1){1.5}} +\put(20,0){\line(0,1){1.5}} +\put(25,0){\line(0,1){1.5}} +\put(30,0){\line(0,1){1.5}} +\put(1.25,0.5){\makebox(0,0){\small $n$}} +\put(3.75,0.5){\makebox(0,0){\small 符号}} +\put(7.5,0.5){\makebox(0,0){\small 指数部}} +\put(12.5,0.5){\makebox(0,0){\small $a_0$}} +\put(22.5,0.5){\makebox(0,0){\small $a_{n-1}$}} +\put(27.5,0.5){\makebox(0,0){\small $a_{n}$}} +\put(2.5,1.1){\makebox(0,0)[b]{\small $q[0]$}} +\put(7.5,1.1){\makebox(0,0)[b]{\small $q[1]$}} +\put(12.5,1.1){\makebox(0,0)[b]{\small $q[2]$}} +\put(22.5,1.1){\makebox(0,0)[b]{\small $q[n+1]$}} +\put(27.5,1.1){\makebox(0,0)[b]{\small $q[n+2]$}} +\put(17.5,0.5){\makebox(0,0){$\cdots\cdots\cdots\cdots$}} +\end{picture}} +ここで,各$a_i$, $0\le i\le n+1$は0\,〜\,999の範囲の自然数であって,符号部は +(前節のように)0が正,1が負,2がNaNを表す.即ち,仮数部を基数1000で表現 +している\footnote{乗法を行う場合,基数の平方が処理系の内部で扱える必要は +ないように感じるが,それを考えると,基数に32768とか10000とかを使った方が, +メモリも計算の手間も減ることになる.しかし,glueに格納するのが21桁である +から,1000にするのもそんなに悪くないように思う.}ことになる.$a_{n}$は桁 +上がりなどの際に用いられ,所謂「正規化された状態」では$a_n=0$, $a_{n-1}\ge +100$である.また,指数部は(正規化された状態では)$-32767$\,〜\,$32767$の範囲 +の整数が通常の浮動小数点数を,32768が無限大を表す.NaNや0に符号の区別は +なく,当然ながらIEEE 754/754r規格には全然適合しない.$n$を「浮動小数点数 +の長さ」と以降呼ぶことにする. + +このような配列は,最初の実装では,その都度動的に確保,解放することにした +\footnote{このポリシーは5.6節で変更される.}.\TeX でのメモリ管 +理はすべて\TeX 自身が行う\footnote{起動時に巨大な4\,byte整数型の配列を確 +保して,あとは全部その枠内で行われる.配列確保と解放はそれぞれ +$\langle{\it pointer}\rangle:={\it get\_node}(\langle{\it +length}\rangle)$と{\it free\_node}($\langle{\it +pointer}\rangle,\langle{\it length}\rangle$)で行われる.ここで +$\langle{\it pointer}\rangle$は先頭要素のindexであり,$\langle{\it +length}\rangle$は確保された配列の要素数である.}ことが伝統的になっている + (\cite{arizawa}) ので,ここでも当然それに従う. + +\eteiri 浮動小数点の四則演算を大きくわけると,仮数部同士の計算と,指数部 +の調整に2分される.前者は前に書いたように多倍長整数の四則計算となるので, +Knuth~\cite{TAOCP}にある「古典的な」アルゴリズムをそのまま用いることがで +きる. + +これらのアルゴリズムは(割り算を除けば)そんなに長くはなく,指数部や符 +号の処理,無限大やNaNの処理の方が分量的には多い.整数演算として得られた +仮数部を正規化する処理や,加法や減法で行われる2引数の指数部を揃え +る処理,また乗法や除法で行われる,列の長さを延長したり縮小したりする処理 +の方にいっそう気を使った. + +%%% 要検討:除算をNewton法で,short_mult + +\subsection{入出力と型変換} +演算はできるようになっても,それを入出力することができなければどうしようも +ない.浮動小数点はglueとして\verb+\skip+レジスタに格納されるので, +\verb+\skip+レジスタに対して直にpackされた値を指定したり,あるいは +\verb+\the+で出力をしたりすれば一応はいいのだが,それでは非常に使い勝手 +が悪い. + +\eteiri +入力側についてのほとんどの処理は +浮動小数点数を読み込み,内部表現の配列の形に変換して返す\textit{scan\_float}\ +procedureによって行う. +これは整数を読み込む\textit{scan\_int}や長さを読み取る +\textit{scan\_dimen},glueを読み取る\textit{scan\_glue}の各procedureに対 +応するものとして考えたもので,コードも大いに参考にさせてもらった. +2項演算のコマンドの2つめの引数を読み取る部分もこのprocedure「だけ」で行 +われる. + +\textit{scan\_dimen}では整数部分を読むのに\textit{scan\_int}を用いて,次 +に小数部を独自に読み取るという方法をとっていたが,同じ方法では21桁の数値 +を読み取ることはできない.そこで,\textit{scan\_float}では,先に(すぐ後 +で述べる)内部表現の配列を21桁分確保し,それに上の方から数字を詰めていく +という方法をとった.22桁め以降が存在した場合は,Knuth~\cite{TAOCP}に従い「基本 +的には四捨五入だが,丸める桁が5である場合は最も近い偶数になるように」丸め +る\footnote{この丸め方は内部演算で共通である.全部の下位の桁を見てるわけ +では無いので,丸め誤差は最大で0.6\,ulpぐらいになるはずである.}.こうし +て仮数部を読めるだけ読んだ後,もし{\tt e}または{\tt E}があれば,その後に +指数部が続くものと認識して,指数部を\textit{scan\_int}で読み取る.こうし +て仮数部も指数部も両方読み込んだ後は,\textit{scan\_float}はこれをglueと +してpackし,それを返す. + +\eteiri +また,「浮動小数点数を読み取る」とはいっても,文字列で書かれた{\tt +-1.701E5}だけを「読み取る」のではあまり便利ではないので, +既存のskipレジスタや,countレジス +タやdimenレジスタも指定できるようにしてある.skipレジスタの場合は,ある +浮動小数点数を表現していない可能性も考えられるので,そのチェックを行うよ +うにしてある.一方,countレジスタやdimenレジスタはそのようなことについて +はチェックする必要はない. +なお,dimensionを直に,例えば\verb+1.2mm+とか指定された場合は,最初に出会う +文字が1であるから,浮動小数点数が文字列表記されているものと見なされるの +で,意図した結果は絶対に得られないことに注意. + +\eteiri +出力部で問題になるのは「どの書式 +で出力するか」である.ご存知のようにFortranでは{\tt FORMAT}文が,C言語では +{\tt printf}文の第一引数が出力書式の設定を担っており,何桁出力するだとか,指数 +形式にするのかそうでないのかとか,いくつかの設定項目が用意されている.今 +回ではそういう本格的な出力機能を実装することはせずに,primitiveとしては以 +下に絞ることにした: +\begin{enumerate} +\item\verb+\fpfrac+:仮数部を$\pm a.bcd\cdots$の形で出力する.最後に0が + 続かない範囲内でできるだけ多くの桁を出力する.正数の場合は符号は出 + 力されない. +\item\verb+\fpexpr+:指数部をそのまま出力する. +\end{enumerate} +浮動小数点数全体を一度に出力するprimitiveを準備しなかったのは,「そうい +うのはマクロ機能があれば用が足りる」ことである.また,\TeX の数式組版能 +力を生かさないのは勿体ないことではないか,とも考えたからである. +\skip1=\real-1234567890123456.4 +例えば$-1234567890123456.4$を{\tt\fpfrac\skip1{}E\fpexpr\skip1}と出力す +るよりかは, +$\fpfrac\skip1\times10^{\fpexpr\skip1}$など +と表示させる方が見栄えが良い. +桁数指定については(dimensionの表示とかにもそのような +機能は無いので)見送ることにした. + +\eteiri +countレジスタやdimenレジスタから浮動小数点数の変換が実装されたのだから, +逆の,即ち浮動小数点数から整数やdimensionへの変換も実装されるべきである. +しかし,dimensionの\TeX での内部表現を考えると,2つの処理はあまり違わないよ +うにできる.dimensionへの変換は浮動小数点数をsp単位に(つまり,65536をか +けて)したものの整数部をとれば終わってしまう. +丸め方については,0に近い方に丸めるとしたが,dimensionへの変換は一連の計 +算の最後で行うことと決めておけば.あまり不都合は起こらないように感じる. + +\subsection{虫取り} +以上の機能を実装した所で(実際は実装と半分平行した感じで)debugを行った. +もはや\trip\ test等には頼ることはできず,全部自分でなんとかしなければならな +い.元からtypoが多い方なのでbugは多量に及び,かなりの時間と気力をdebugに +とられてしまった.debugは主に加算や平方根を求めるNewton法,$e$のTaylor展 +開による計算などの繰り返しで行った.演算アルゴリズムの部分にも,タイプミ +スや僕の詰めの甘さ(加減算での符号の処理など)が見られたが,厄介だったのは +\TeX 自身のメモリ管理による動的確保/解放の処理であった. + +先の脚注に書いたように,\TeX でのメモリ確保は最初に巨大な配列が確保され +た後はすべて\TeX 内部の\textit{get\_node}関数などによって行われるのであっ +た.動的確保で避けて通れない問題として,初期化忘れと解放忘れ,それに2重 +の解放がある.前者については対処方法は簡単なのだが,後者2つが曲者だった. +浮動小数点数を内部で表現する配列は自分で作ったことがよくわかっているから, +それについては問題ない. + +\eteiri +一方,実はglueの格納についても動的確保/解放が使 +われている.glueはwidth, stretch, shrinkの3つの部分があると書いたが,内 +部ではさらに\textit{glue\_ref\_count}という量が各glueについて設けられてい +る.これは名前の通り「何個の変数がこのglueを指しているか」というのを示す +値であって,glueを解放するように\textit{delete\_glue\_ref} procedureで指令 +しても,\textit{glue\_ref\_count}が0でない限り\footnote{本来はnull値基準 +なのだが,そこまで細かい所はどうでもいい.}実際には解放されないようになっ +ている.そして,skipレジスタに実際に格納されているのは実際のglueの値へのポイ +ンタとなっている. + +動作確認をしたところ,\verb+\fpadd+などであるskipレジスタの値が演算結果に +よって書き換えられるような場合に,書き換え元のglueは(他にそれを参照して +いる変数が無い限り)解放されるべきであるにも関わらず,なぜか解放されない +まま,いわば次々と過去の遺物だけが増えていってしまうという事態が起こった +\footnote{\verb+\tracingstats+に例えば3ぐらいの値を指定しておけば, +\TeX でのメモリ消費量がページ出力時に表示される用になる.}. +1回あたりでは些細な量としかならないが,しかしbugはbugである.これを除去 +するために,解放指令を1回多く入れたら,今度は無限ループやらsegmentation +faultが出て強制終了するという事態が発生した. + +結局,\textit{scan\_float} procedureの内部で既存のglueを取り出す所で +reference countが1増加しているのではないかという結論に達し, +\textit{glue\_ref\_count}だけを1減少させる処理をそこに加えた所,うまく動くよう +になった. + +\subsection{初等関数} +次に,初等関数の実装である.基本的には,関係式を用いて引数を0近傍のある値 +にまで持っていって,そこから先をTaylor展開などを用いて計算させ,関係式を逆に +用いて元に戻すというものである.平山\nobreak\cite{mppack}での実装と奥村% +\nobreak\cite{okuc}を大いに参考にした. + +ここで,関係式の適用と逆向きの適用により誤差が入り込む余地があるので, +そこをなんとかするために内部の四則演算を任意精度でできるように実装したの +である.本節の関数の計算では.$n$桁の引数が与えられた時に,内部では +$n+15$桁で計算を行っている.この分量は「まあこれぐらい桁を増やしておけば +いいか」という勝手な推測で選んだものであって,適切かどうかは知らない. + +\paragraph{平方根 (\textit{fp\_sqrt})} +$a$の平方根$\sqrt a$の計算は,方程式$1-a/x^2=0$から導かれるNewton法 +$x_{n+1}:=(3-ax_n^2)x_n/2$を用いることにした.このNewton法では$1/\!\sqrt +a$が2次収束で計算され,収束後$x_\infty$に$a$をかければ,$\sqrt a$が得られ +る.$a$ +は$[0.1,10)$の範囲内に入るように変換して計算することとして,初期値$x_0$ +は,$a$の上位桁をいくつかとったものの平方根を奥村 +\nobreak\cite{okuc}に載っているアルゴリズムを使用して計算したものとした. + +なお,この関数のdebug中に,ずっと前に書いた「列の長さの縮小」の丸め処理 +にbugが見つかった.原因は{\bf while}\ $i<n+1$ {\bf do} ... のルー +プで,$i$も$n$も更新せずに回していたことであった.このように,初等関数の +debug中に,既に組んだ四則演算等のbugが発見されることが結構あったが,以降 +はいちいちそれを書かないことにする. + +\paragraph{指数関数 (\textit{fp\_exponent})} +指数関数はTaylor展開$\exp x=\sum_{i=0}^\infty x^i/i!$の有限 +項の部分和で計算する.収束を速めるためと,交代級数の計算に桁落ちの恐れが +あることから,Taylor級数の計算は$x\in[0,1]$の範囲内だけで行い,一般は +$\exp 2x=(\exp x)^2$, $\exp(-x)=1/\exp x$でそれに帰着させている. + +\paragraph{三角関数周辺 (\textit{fp\_tri\_hyp}, +\textit{fp\_ceil\_floor})} +ご存知のように,三角関数と双曲線関数のTaylor展開は符号が異なるだけである. +さらに,$\tan x=\sin x/\cos x$ であり,sinの展開は奇数次のみが,cosの展開 +には偶数次のみが現れるので,$\sin x$と$\cos x$を(あるいは,$\sinh x$と +$\cosh x$を)同時に計算するのも悪くは無い.$\cos x$, $\cosh x$のTaylor展 +開の計算では,桁落ちを防ぐために2次の項から先の和を計算して,すべての計算 +の後に1を足すという方法をとった. + +いつものように収束を速めるため,三角関数では引数を$[0,\pi/4]$に, +双曲線関数では引数を$[0,1]$に帰着させる.三角関数では,引数$x$ +に対して$a:=x-2\pi \lfloor x/2\pi\rfloor$として,$a/4$に対してTaylor展開 +の計算を行い, +\[ + \sin 2x=2\sin x(\cos x-1)+2\sin x,\qquad +\cos 2x-1=-2\sin^2 x +\] +を2回用いて答えを計算する.\newpage + +双曲線関数では, +\[ + \sinh 2x=2\sinh x(\cosh x-1)+2\sinh x,\qquad +\cosh 2x-1=2\sinh^2 x +\] +を同様に用いる. + +また,前段落の$a$の式から分かるように,$\lfloor\cdot\rfloor$の計算が必要 +となる.これと同じようなコードで$\lceil\cdot\rceil$も計算できるので,つ +いでに両者を行う\textit{fp\_ceil\_floor}\ procedureもここで書いた. + +\paragraph{対数関数周辺 (\textit{fp\_log\_inner}, +\textit{fp\_log}, \textit{fp\_arc\_hyp})} +対数関数は,奥村\nobreak\cite{okuc}によれば +\[ + \frac12\log\frac{1+u}{1-u}=u+\frac{u^3}{3}+\frac{u^5}{5} ++\frac{u^7}{7}+\cdots +\] +を計算する方が速いとあるが,明らかに分かるようにこの式はarctanhのTaylor +展開式そのものである.$x=(1+u)/(1-u)$を解くと$u=(x-1)/(x+1)$となり,これ +は$x>0$では単調増加で$x=1$のときに$u=0$となる.当然収束を速めるためには +$|u|$が小さい方がよいので,$x$を1の近傍の範囲に帰着させて計算をおこな +うようにする. +帰着方法は単純で,まず適切な$10^n$を掛けて$x\in [1,10)$と +させ,以下のようにさらに変換する: +\def\from{\leftarrow} +\begin{alignat*}{4} +x \in[1,1.5)&\Longrightarrow \text{\inhibitglue(そのまま)\inhibitglue},\qquad& +x \in[1.5,3)&\Longrightarrow x\from x/2,\\ +x \in[3,6)&\Longrightarrow x\from x/4,& +x \in[6,10)&\Longrightarrow x\from x/8. +\end{alignat*} +こうすると,$|u|\le 0.2$となり,収束速度はかなり速いものと予想される.逆 +変換に必要な$\log 10$, $\log 2$, $\log 4$, $\log 8$については,$\log 10$ +と$\log 64$を定数として内部に持っておくこととした. + +対数関数$\log x$を実装してしまえば,逆双曲線関数は以下の式 +で計算可能である: +\begin{align*} +\mathop{\rm arcsinh} x&=\log(x+\sqrt{x^2+1}),\\ +\mathop{\rm arccosh} x&=\log(x+\sqrt{x^2-1}),\qquad x\ge 1\\ +\mathop{\rm arctanh} x&=\frac12\log\frac{1+x}{1-x},\qquad |x|<1 +\end{align*} +この中でarctanhの実装はlogのそれの内部に入り込む形になっているので,引数 +が小さい場合には$\log x$の内部計算部(即ち,本節の最初に示したTaylor展開 +の計算)にそのまま引き渡してしまうようにした. + +しかし,この式では$x\simeq 0$であるとき,$x+\sqrt{x^2+1}\simeq 1$となる +ので桁落ちが発生する.そこで,$x$の有効桁数が$3n$であるとき, +$|x|<10^{-n-5}$であれば,次のTaylor展開式を用いてarcsinhを計算することにし +た: +\[ +\mathop{\rm arcsinh} x=x-\frac{x^3}6+\frac{3x^5}{40}-\cdots. +\] +\paragraph{逆三角関数 (\textit{fp\_arc\_tri})} +逆三角関数は多価だが,常識的に考えれば$\arcsin x$, $\arctan x\in +[-\pi/2,\pi/2]$, $\arccos x\in[0,\pi]$とするのが適当だろう.$\arcsin +x=\arctan (x/\!\sqrt{1-x^2})$であるから,$\arctan x$だけ計算すればよいが, +これはいつものように級数展開 +\[ + \arctan x=\sum_{n} \frac{(-1)^nx^{2n+1}}{2n+1},\qquad |x|\le 1 +\] +を用いる.$\arctan x=\pi/2 - \arctan x^{-1}$, $\arctan x=\pi/4 - \arctan +((1-x)/(1+x))$を用いれば,$|x|\le \tan \pi/8=\sqrt 2-1=0.414\cdots$まで +できて,収束は保証される. +\paragraph{べき乗 (\textit{fp\_pow\_int})} +一般には$a^b$の計算は$\exp(b\log a)$とすればよいが,それでは$(-2)^5$など +の$a\in[-\infty,0)$, $b\in\mathbb Z\setminus\mathbb N$のときが計算できな +い.このため,指数部分が整数のときの累乗を計算する関数 +\textit{fp\_pow\_int}を作った.方針は奥村\nobreak\cite{okuc}に従い,例えば$b=1701$の +ときは,$1701=1024+512+128+32+4+1$であるから,$x_0:=a$, $x_{n+1}:=x_n^2$ +としたとき,$a^b=x_0x_2x_5x_7x_9x_{10}$として求めれば良い. + +気になるのは$0^0$の扱いだが,本来はNaNとするのが正当な扱いであろう.しか +し,ここでは手抜きし,\textit{fp\_pow}でも\textit{fp\_pow\_int}でも1とし +た.後から考えたり見つけたりしたこじつけを3つばかり: +\begin{itemize} +\item $a^b=\exp(b\log a)$を無理やり$a=b=0$の +ときにも適用して,``$0^0=\exp(0\log 0)=\exp(0\cdot -\infty)=\exp 0=1$''. +\item $m^n=\#\{f\colon n\longrightarrow m\}$である\footnote{集合論的定義に従い, +$m=\{0,1,\ldots,m-1\}$として考えている.}から, +$0^0=\#\{f\colon0\longrightarrow 0\}=\#\{f\colon +\emptyset\longrightarrow\emptyset\}=1$となる. +\item 二項定理$(1+m)^n=\sum_{i=0}^n {n\choose i}m^i$を$m=n=0$のとき成立 + させるために必要. +\end{itemize} + +\subsection{高速化} +一応以上に挙げた関数の実装は行ったが,これらの関数は演算の途中経過が求ま +る度に動的確保/解放を行っており,arcsinを求めるだけで800回以上の動的確保 +を行っていた.これは速度的に非常に不利であるので,できる限り動的確保を行 +わずにすむように書き直す必要があった. + +方針としては次の通りである:各演算では,当然引数と結果を格納するための領 +域と,一時領域が必要になるが,引数の有効桁数が(つまり,引数を表現するの +に必要なメモリ領域の量が)わかっていれば,一時領域の大きさはそこから計算 +することができる.元々の呼び出し元は\textit{do\_float\_operation}という1 +つのprocedureである\footnote{ここで\TeX のコマンドで渡された演算指令が最 +終的に実行され,結果を表現するglueが得られる.}.よって,必要な一時領域の上限が +わかるので,演算を実際に呼び出す前に適当な所で確保しておけば良い. + +演算の種類によって一時領域の量は次の様になった: +\jdAline[c](1){\small\tabrowsep=0.5zw%\setbox0=\hbox{fp}\advance\tabrowsep-\dp0 +\btabular{c/lrr/r}\vline +\emph{演算}&\multicolumn{1}{c}{\emph{procedure名}}&% +\emph{ 引数 }&\emph{ 返り値 }&% +\multicolumn{1}{c}{\emph{一時領域}}\\\hline +$+$, $-$&\textit{fp\_add\_or\_sub}&$n$, $n$&$n$&$n+3$\\ +$\cdot$&\textit{fp\_mul}&$m$, $n$&$m$&$m+n+3$\\ +$/$&\textit{fp\_div}&$n$, $n$&$n$&$5n+15$\\ +$/$ (short)&\textit{fp\_short\_div}&$n$&$n$&$2n+10$\\ +$a^2$&\textit{fp\_square}&$n$&$n$&$2n+3$\\ +$\lfloor\cdot\rfloor$, $\lceil\cdot\rceil$% + &\textit{fp\_ceil\_floor}&$n$&$n$&$n+3$\\\hline +\smash{$\sqrt{\hskip0.5zw}$}&\textit{fp\_sqrt}&$n$&$n$&$4n+32$\\ +$\exp$&\textit{fp\_exponent}&$n$&$n$&$4n+32$\\ +$\sin$, $\cosh$ etc.&\textit{fp\_tri\_hyp}&$n$&$n+5$&$5n+40$\\ +$\log$(内部)&\textit{fp\_log\_inner}&$n$&$n$&$4n+12$\\ +$\log$&\textit{fp\_log}&$n$&$n$&$6n+48$\\ +$\arcsin$ etc.&\textit{fp\_arc\_tri}&$n$&$n+5$&$8n+120$\\ +arcsinh etc.&\textit{fp\_arc\_hyp}&$n$&$n+5$&$8n+120$\\ +$a^b$ if $b\in\mathbb Z$&\textit{fp\_pow\_int}&$n$&$n$&$3n+24$\\\vline +\etabular} +一時領域の欄の単位は +4\,byteであり,引数と返り値はそれぞれを表す浮動小数点数の「長さ」を表してい +る\footnote{動作切り替えのブール値や整数の引数はすべて省略している.}. +但し,下半分の演算については,上半分の四則演算等の一時領域は除いて計算し +ている. + +ここで,初等関数の演算のために,$\pi$, $\log 10$, $\log 64$を定数としてもっ +ておくことは前節に書いた.この定数の初期化と一時領域の確保は同時に行って +も良いだろう,しかし,一時領域と定数たちだけでメモリの$80+184+3\cdot +23=333$要素が使われることになり,常時確保しておくのは気が引ける +\footnote{現在のように贅沢にメモリが使える環境ではごく僅かの量である.な +お,内部演算は最大$3(8+5)=39$桁で行われるので,四則演算に必要な一時領域 +は80要素あれば充分となるのだが,80113.22より前の版では,長さ18で四則演算 +されてしまうバグがあった.}.そこで, +この「初期化」を行う\verb+\fpinit+コマンドと,逆に一時領域や定数たちを解 +放する\verb+\fpdest+コマンドを作り,\emph{浮動小数点演算を使用する場面の +前後にこれらのコマンドを実行させる}ようにした.なお,実装の簡略化のため, +二重確保や二重解放のチェックは全く行っておらず,一時領域が確保されてない +状態で演算を行おうとしたときのエラー処理も全く行っていない.確保されてな +い状態で演算を行えば,最悪の場合はセグメンテーション違反で落ちることにな +るので気をつけること. + +\section{形式化} +浮動小数点演算を実装したところで,説明文をつけたりinstall script +をつけたりする段階へと入ることにした.ここら辺を行う直前になって,角藤 +さんの\peTeX が登場した\verb+^^;+. + +\eteiri +一番苦労したのは,「\epTeX のためにどのファイルを修正したのか分からない」 +ということであった.{\tt ptexextra.c}の変更は,コマンドラインオプション +{\tt -etex}をつけるためにやったことを覚えていたが,結構それ以外にも変更 +したファイルがあったものだった.なお,僕はMakeの使い方が分からないので, +コンパイルとインストールは基本的には(自分の環境用の)bash scriptとして +準備して,何をやっているかは別途テキストファイルに書いておいた. + +\pTeX から\epTeX への修正部分を分類してみると,その性格の違いからいくつも +のファイルに分けた方が気分がいいと思ったので,そのようにした.実質的に何 +もしてない{\tt ptex-orig.diff}を削除したり,{\tt ptex-hack-1.diff}(次章 +参照)を入れたり取ったりとかで整理した結果,本プロジェクトの最終結果とし +ては以下のようになった: +\footnote{以下は{\tt README.txt}からの引用である.}. +\eteiri +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + ■ファイル構成 + ---------------------------------------------------------------------- + README.txt このファイル. + Changelog 更新履歴 + HOWTOINST.txt インストール方法について + doc/ 浮動小数点演算についての簡易説明書 + ks2/ 「計算数学II」での詳細な作業記録 + build buildするための(自分用の)bash script + install installするための(自分用の)bash script + trip TRIP, e-TRIP testを実行させるbash script + eptex.src etex.srcをe-pTeX用に改変したもの.ほとんど同じ + eptexdefs.lib etexdefs.libをe-pTeX用に改変したもの.ほとんど同じ + ep1.diff \ + pconvert.diff |- e-TeX機能のマージに使用するpatch群 + etex-sysdep.ch | + etex.diff / + fp.ch 浮動小数点演算の実装部 + ptex756.diff pTeXをWeb2C-7.5.6に対応させるpatch + uptex.diff \_ upTeXとマージしようとするときに使用するpatch群 + up1.diff / +\end{verbatim} +\end{adjustvboxheight} + +\newpage +\section{細かい機能追加} +\subsection{\TeXXeT の実装} +角藤さんによる\peTeX に触発されて\footnote{対抗して, +と言った方が実状にあっているが.},\epTeX でも\TeXXeT 機能の実装を試みる +ことにした.浮動小数点演算の部分は\eTeX 拡張とは完全に切り離せるので, +{\tt fp.diff}を組み込まない状態でも作業を行える. + +作業方法は「\eTeX のマージ」で行ったものとほとんど同じである.オリジナル +の{\tt etex.ch}と前に作った対\pTeX 用の{\tt etex.ch}を見比べ,\TeXXeT 機 +能で後者に抜けているものがあれば加えたりした.これにより,新たな{\tt +etex.diff}は\TeX から\pTeX への変更に伴う部分だけとなり,分量が減った. + +\eteiri \verb+\beginR+と\verb+\endR+ではさまれた区間は右から左に文字が組 +まれる区間であるが,そのまま{\tt etex.ch}の方法を使うと日本語が通らずに, +強制終了したりdviが読めなくなったりする.これの原因を次のように考えた: + +\begin{indented}{2zw} +right-to-leftを実現させる部分に,「全ての」構成要素を逆順にするという +\textit{reverse}\ functionがある.例えばLtoRの状況で「{\tt +...abcdefABghCDEFij...}」:小文字は欧文文字,大文字は2つで和文文字を表す +となっていたものが,このprocedureにより{\tt ...jiFEDChgBAfedcba...}と反転され +てしまい,それによってエラーが発生する.従って,和文文字のところは反転せず +に{\tt ...jiEFCDhgABfedcba...}という結果を得るようにすれば,エラーは起き +ないのではないか? +\end{indented} + +\eteiri +\pTeX のソースで\verb+if font_dir[f]<>dir_default then+とかいう +フレーズが何回かあったので,これを2\,byte文字と1\,byte文字の判定と考えること +で上の処理を実装したところ,一応はうまくいくようになった. +しかし,組版規則はどうか,というと当然 +のことながら「怪しい」.ただ単に全部左右が入れ替えられるだけであるからだ. + + +\subsection{副産物} +\TeXXeT 関連のdebugを行っていたときに,和欧文混在の文章をright-to-leftに +したら上下位置がおかしくなることに気づいた.「全てを逆順に」がここでも悪 +さをしており,\pTeX により和欧文間に挿入されるbaseline補正の指 +標\textit{disp\_node}までも逆順にされてしまうからだった. + +\pTeX では,和文と欧文の境目に\textit{disp\_node}が挿入され,このnode以降 +の文字のbaseline補正がそこで示されるようになっている.したがって,和文→ +欧文と切り替わるときのnodeでは\verb+\ybaselineshift+とかが,逆に切り替わ +るときのnodeでは0が対応している.よって,一時変数を使って, +\textit{reverse} functionで反転させるときに,\textit{disp\_node}の値も入 +れ替えてしまえばいいのではないか,と推測される.それで実際大抵の場合には +うまくいったように思えた\footnote{1/30追記:実際には,こんな簡単な処理 +ではダメだった.段落全体がRtoLの状態のとき,どうやら,各行はdisplacement +nodeで始まっており,その後に\TeXXeT 関連のnodeとかがくるようで,こういう +場合が曲者だったりする.global変数\textit{revdisp}を作り,その変数に「現 +在のdisplacementの値」を代入するようにしておくことで,何とか対処療法的に +片付けて,\emph{「大抵の場合にはうまく動くのではないか」という段階にはなったけ +れども,\pTeX の内部動作を良く理解しているわけではないので,非常に怪し +い}.使うときには注意してください.}. + +\eteiri +こうしてなんとか解決した直後に, +たまたま\TeX フォーラム% +\footnote{\verb+http://oku.edu.mie-u.ac.jp/tex/+}を覗いたら,奥村さんに +よる「\pTeX への +提案もどき」と称した次の投稿\cite{okupt}があった(以下引用): +\newpage +\begin{adjustvboxheight} +\small\narrowbaselines\begin{indented}{2zw} +\begin{verbatim} +その1: \ybaselineshiftの仕様変更 + +和文と欧文のベースラインを調節するための\ybaselineshiftを使っても数式部 +分のベースラインが変わらない。数式も欧文なみと見て移動したい。 + +例: + +\ybaselineshift=0.12zw +第5章第$n=5$節 + +その2: 段落の頭での引用符の挙動の改善 + +デフォルトのpTeXでは引用符で始まる段落の頭が\parindent+0.5zw下がりになる。 +jsarticle,jsbookでは\everyparを使ったハックで補正しているが,pTeX本体に +段落頭のJFMグルーをなくすスイッチを付けられないか。 + +(後略) +\end{verbatim} +\end{indented} +\end{adjustvboxheight} + +この「その1」というのは,僕も散々悩まされてきた問題であった.古くは高校の +部活の部誌(縦書き)の組版で,最近では数学科オリパンフ\nobreak\cite{ori} +の組版でも遭遇し,非常に腹が立った.「その2」は現状のjsclassesでのハック +で十分だと思い,またこちらは難しそうだった. + +「その1」のパッチを作るのは,\textit{disp\_node}が挿入される位置を調べ,そ +こでいかほどの値がセットされるかを調べればいいので,さほど +困難な作業ではなかった.互換性のために従来の\pTeX の動作も残し,スイッチ +で切り替えるようにしたが,スイッチの定義は\verb+\TeXXeTstate+(\TeXXeT +がonならば1,offならば0)のそれが非常に参考になった. +\eteiri +最初は\epTeX 内部に本パッチを取り込んでいたが,(後に述べるように)角藤 +さんが\epTeX をW32\TeX に導入するときに外されたと聞いたので,こちらでも +外しておくことにした. +\subsection{さらなる虫取り} +本稿では,\etrip\ testをしたときの\eTeX との差異をもっと少なくすることを +行う.まず,通常の\trip\ testを行ったときに,そのままでは +\verb+http://oku.edu.mie-u.ac.jp/%7Eokumura/texfaq/qa/50546.html+ +と同様の症状,すなわち\verb+, direction+がいくつか余計に残ってしまうこと +から対処を始めた.これの原因は\pTeX でboxの中身をdumpしたときに +\verb+, yoko direction+の表示部である. +boxが{\tt yoko}でも{\tt tate}でも{\tt +DtoU}方向\footnote{{\tt DtoU}方向ってなんだろうね.}でもないときは +\verb+yoko+などが表示されず,ただ\verb+, direction+と表示されてしまうの +だった. +{\tt ,}が出てくる場所は1箇 +所だったので,ここだけdirection表示のコードを別にすることで解決. + +\eteiri +次に,\verb+\lastnodetype+と\verb+\currentiflevel+の調整に入った. +\eTeX でコマンドがどう処理されているかを調べると,各nodeにはソース中で型 +を表す自然数が割り振られており,その値に1を足すとかの若干の補正をして出 +力するだけだった.そうすると話は速く,\TeX${}\to{}$\pTeX の拡張で内部パ +ラメータがどれだけ変更されているかを調べ,それに合うように両コマンドを +hackするだけであった. + +これらのコマンドの正しい動作は,\eTeX のマニュアル\nobreak% +\cite{etexman}に与えられている.\pTeX で追 +加されたnodeや条件判断文には,既存の番号より大きい値を与えるようにした. +具体的には,下の表のようになった.上が\verb+\currentiflevel+,下が +\verb+\lastnodetype+の動作で,番号が太字なのは\pTeX 特有のものである +\footnote{当然ながら,\verb+\iffp+は本プロジェクトの浮動小数点演算の実装 +に特有である.}. +なお,これに合わせるように{\tt etexdefs.lib}を更新した{\tt +eptexdefs.lib}も作ってある: + +{\def\cs#1{{\tt\char`\\#1}}\makeatletter +\newenvironment{multilist}[2]% + {$$\setbox\z@=\hbox\bgroup % catch some funny things -> \mathord + \let\a=\empty + \let\b=\empty + \count@=\z@ + \toks@={#2}% + \def\item##1\cr + {\ifnum \count@=\z@ + \count@=#1% + \expandafter\def\expandafter\b\expandafter{\b\y{}}% + \fi + \advance\count@ by\m@ne + \expandafter\def\expandafter\a\expandafter{\a\x{##1}}}% + \ignorespaces}% + {\loop + \ifnum \count@>\z@ + \expandafter\def\expandafter\a\expandafter{\a\expandafter\z\b\relax}% + \advance\count@ by\m@ne + \repeat + \def\x##1{\expandafter\y\b\relax{##1}}% + \def\y\y##1##2\relax##3% + {\ifx @##1@% + \def\b{##2\y{##3}}% + \else + \def\b{##2\y{##1&##3}}% + \fi}% + \def\z\y##1##2\relax{\def\b{##2\y{##1}}}% + \a + \def\x + {\expandafter\egroup\expandafter\halign\expandafter\bgroup + \expandafter&\the\toks@\cr}% + \def\y##1{\expandafter\def\expandafter\x\expandafter{\x##1\cr}}% + \b + \x\egroup $$} +\begin{adjustvboxheight}\small +\begin{multilist}{4}{\hfil\qquad#:&\quad#\qquad\hfil} +\item 1&\cs{if}\cr +\item 2&\cs{ifcat}\cr +\item 3&\cs{ifnum}\cr +\item 4&\cs{ifdim}\cr +\item 5&\cs{ifodd}\cr +\item 6&\cs{ifvmode}\cr +\item 7&\cs{ifhmode}\cr +\item 8&\cs{ifmmode}\cr +\item 9&\cs{ifinner}\cr +\item 10&\cs{ifvoid}\cr +\item 11&\cs{ifhbox}\cr +\item 12&\cs{ifvbox}\cr +\item 13&\cs{ifx}\cr +\item 14&\cs{ifeof}\cr +\item 15&\cs{iftrue}\cr +\item 16&\cs{iffalse}\cr +\item 17&\cs{ifcase}\cr +\item 18&\cs{ifdefined}\cr +\item 19&\cs{ifcsname}\cr +\item 20&\cs{iffontchar}\cr +\item \bf 21&\cs{iftdir}\cr +\item \bf 22&\cs{ifydir}\cr +\item \bf 23&\cs{ifmdir}\cr +\item \bf 24&\cs{iftbox}\cr +\item \bf 25&\cs{ifybox}\cr +\item \bf 26&\cs{iffp}\cr +\end{multilist} +\end{adjustvboxheight} +\begin{adjustvboxheight}\small +\begin{multilist}{3}{\hfil\qquad#:&\quad#\qquad\hfil} +\item -1&none (empty list)\cr +\item 0&char node\cr +\item 1&hlist node\cr +\item 2&vlist node\cr +\item 3&rule node\cr +\item 4&ins node\cr +\item 5&mark node\cr +\item 6&adjust node\cr +\item 7&ligature node\cr +\item 8&disc node\cr +\item 9&whatsit node\cr +\item 10&math node\cr +\item 11&glue node\cr +\item 12&kern node\cr +\item 13&penalty node\cr +\item 14&unset node\cr +\item 15&math mode nodes\cr +\item \bf 16&direction node\cr +\item \bf 17&displacement node\cr +\end{multilist} +\end{adjustvboxheight}} + +\eteiri +これでだいぶ\trip, \etrip\ testの動作はうまくいくようになった.状況を述 +べると,以下のようになる. +\begin{itemize} +\item \emph{Compatibility modeでの\trip\ testの,\pTeX との差異}\\最後の + 方の{\tt 1440 strings of total length 25223}等が異なるだけ. + ソース中の文字列が多くなっていたりすることなどによるものだろう. +\item \emph{\trip\ testの,\eTeX との差異(両方ともCompatibility mode)}\\ +↑を除けば,\pTeX での\trip\ testでも出ている差異なので,問題はな + いと考えられる. +\item \emph{\trip\ testの,\eTeX との差異(両方ともExtended mode)}\\ +「両方ともCompatibility mode」のときの差異と同じような雰囲気. +\item \emph{\etrip\ testの,\eTeX との差異} +\begin{itemize} +\item \verb+\lastnodetype+のチェックで3箇所失敗する.\pTeX の仕様に関わ + るのではないか? +\item Memory usageが多かったり,directionが表示されたりとか,明らかに + \pTeX 拡張によると考えられるもの. +\end{itemize} +\end{itemize} + + +\section{他環境でのコンパイル} +今まで\TeX\ Live 2007上で開発を行ってきたが,\TeX\ Liveは非常に巨大であり, +これを気楽にダウンロード,コンパイルということはやはりし辛いものである. +一方,これ以外に主に使われている(と信じる)\TeX\ distributionとしては, +以下がある. +\begin{itemize} +\item {\bf te\TeX\ 3.0}:Thomas Esserさんが作っていたUnix系OS用のもの.適 + 度な大きさで便利だったのだが,残念ながら3.0をもって開発中止に. +ソースは{\tt CTAN/systems/unix/teTeX/3.0/distrib/}からダウンロードできる. + おそらく大半のlinux distributionがこれをベースにした\TeX 環境を導 + 入している. +\item {\bf ptetex3}:土村さんによるte\TeX 3.0$\,+{}$日本語環境を簡単に + 整えるためのpatch集.公式ページは\\ + \verb+http://www.nn.iij4u.or.jp/~tutimura/tex/ptetex.html+. +\item {\bf up\TeX}:ttkさんによる,p\TeX の内部コードをUnicodeにする実験. + ptetex3内のUnicodeサポート活動 ({\tt ptexenc}) と少なからず関係. + 下のW32\TeX でも使えるが,本来はptetex3へのパッチ. + 公式ページは + \verb+http://homepage3.nifty.com/ttk/comp/tex/uptex.html+. +\item {\bf W32\TeX}:角藤さんの作られているWindows用\TeX\ + distributionの通称.おそらくWindows上で\TeX を利用している人ならほとん + どが入れてるはず\footnote{cygwinでコンパイルしたものを使って,W32\TeX + を使ってない人という人が若干いる模様.}.\\ +公式ページは +\verb+http://www.fsci.fuk.kindai.ac.jp/kakuto/win32-ptex/web2c75.html+. + +ここから一番近いミラーは数理の大島研.インストールにはTA + の阿部さんの「\TeX インストーラ」が非常に便利である. +\end{itemize} +\eteiri + +とりあえず上2つはなんとかサポートするようにするべきだろう.W32\TeX につ +いては,TAの阿部さんからの要望である. + +\subsection{W32\TeX} +W32\TeX のソースは前節の大島研のFTPなどからダウンロードすることができる. +「どうやらVisual C++がコンパイルに必要らしい」ということはわかっていたの +で,MicrosoftのサイトからMicrosoft Visual C++ 2005 Express Editionと +Platform SDKをインストールし,また最新のCygwinもインストールをして,環境 +を整えた\footnote{Platform SDKが必要であることを知るまでに数時間を無駄に +した.}. + +しかし,ここから先が大変だった.p\TeX のソースは{\tt +756/texk/web2c/ptexdir/}にある.どうやら土村さんによるptexenc拡張を取り +入れている様子であった.しかし,なぜかその直上のディレクトリのmakeがうま +くいかず,{\tt tangle}とか{\tt web2c}とかは元々のバイナリのものを使わな +ければならなかった.これらでいろいろ悪戦苦闘したあげく,結局{\tt +ptexdir}のソースをベースにすることは諦めることにした. + +その後,いろいろと慣れないWindows環境のことを調べ,なんとかコンパイルで +きるところまでこぎつけた.しかし,阿部さんから作ったbinaryが動作不良とい +う報告を受け,結構悩むことになった.おそらくDLLまわりの事情だったと思う +のだが,「W32\TeX に取り込む」という角藤さんからの報告が来たので,こちら +でのWindowsバイナリの開発はやらなくても良いような状況になってしまった. + +\subsection{te\TeX\ 3, ptetex3 (ptexenc), up\TeX} +これらはみなWeb2C-7.5.4環境がオリジナルである.従って, +{\tt ptex756.diff}を使わないことが必要になるが,前者2つについては,それ +ぐらいだけであまり注意は必要なかった.ptetex3独自拡張の{\tt ptexenc}について +も,コンパイル時にライブラリを追加するぐらいであった.up\TeX につ +いても,\WEB ソースについては同じであったが,できるプログラム名を{\tt +euptex}などとしてみたため,C headerなどの修正が少し面倒になった. + +後者の{\tt ptexenc}, up\TeX で心配であることは,日本語が\TeXXeT で通るか,とい +うことであった.僕が先に行った\TeXXeT への和文対応では,漢字などの +2\,byte文字が,内部では2つのnodeで表現されていることを前提としたもので +あった.そのため「Unicode拡張によって1文字3\,nodeとかになっていないだろ +うか」と心配した.\WEB\ change fileをざっとざっと見てみた所,どうやらその +ような事態は起こっていないように思えた.どうやら動いてはいるようである. + +\eteiri +このときついでに,{\tt fp.diff}をchange fileの形式に書き直したりもした. +そこで\textit{fp\_sub\_absolute\_value} procedure内で +$\infty-\infty\neq{\rm NaN}$というbugを発見して,修正することができた. + + + +\newpage +\section{今後の課題と,それにまつわる雑感} +今まで書いたような作業をしてきて,最初に気づいたことは,\emph{自分の英語 +力の無さ}である.英語の数学書とかは(英文については)たいした苦もなく読 +めるのだが,一方でいざ自分で書こうとすると表現が全く思い浮かばない.\WEB +ソースを書き換えるにあたっては,とりあえずの英語で間に合わせたけれども, +意味の余り取れないような文章になっているであろうことは確実である.院試ま +でになんとかしたいものだ\verb+^^;+ + +\eteiri 内容面について.浮動小数点の実装をしたはいいが,Pascalの,それも +ごく基本的な仕様に沿っただけの実装であり,速度的にも不利であると思われる. +Beebe~\cite{beebe}にあるように,C製の何か信頼性のおける高速多倍長数値計算ライブ +ラリを利用するというのが手っ取り早くまた安全な方策であろう.しかし,僕は +自分で浮動小数点演算を実装したことがなかったので,一回は自分でコードを書 +いてみたかった. + +また,\eTeX で長さ量とかには\verb+\dimexpr+などがあ +り式の表現が使えるのに,浮動小数点演算ではまだその機能がないとか,やっぱ +り出力書式指定の機能がないというのも気 +になる話である.後者はマクロを頑張っていじればなんとかできそうな気もする. + +\eteiri +最後に,避けて通れない問題であるが,bugの問題がある.特に浮動小数点演算 +の方は自分で書き起こしたものであるから,どんなbugが潜んでいるかは分から +ない.だいぶbugは取れたような気もするが,それは現時点での思い込みであっ +て,やはり心配である. + +\eteiri +ひょっとすると,\pTeX の寿命はもはやあまり長くないのではないかと +心配している.最初に紹介した\TeX の拡張たちや,\pdfTeX を拡張してスクリプ +ト言語Luaを組み込んだLua\TeX,また\XeTeX なんかの存在を聞いてると,純粋な +\TeX に日本語を対応させただけのp\TeX の存在意義は過去の遺産の継承ぐらいし +かなくなり,主流は世界的にもこれらの拡張のどれか or その発展形 +{---}{---}Lua\XeTeX とでも呼べばいいのだろうか?\inhibitglue {---}{---}に +なっていきそうな予感がする.ちょうど,日本電気のPC-9800シリーズと所謂 +「DOS/Vパソコン」の関係のように. + +\eteiri しかし,せっかくこの計算数学IIで「\pTeX に対して,\eTeX の機 +能のマージと浮動小数点演算の実装を行う」ということが大っぴらにできたのだ +から,このまま終わるのは非常に虚しいと思っている.こんなことを言うと「何 +を言っているんだ」と言われそうだが,up\TeX などと共に,\pTeX の地位 +向上に寄与できたらいいな,と思っている. + +\eteiri +以上,いろいろ書いてきたが,冬休み中やそれ以降に,この\epTeX まわりがと +んでもないおおごとになってしまったことには驚きである.取り上げてもらえる +のはうれしいことではあるが,\epTeX がどんどん自分の中に抱えきれないもの +になっているような気もしている. + +\newpage +\section{付録} +\subsection{$\bm\varepsilon$-\pTeX のコンパイル方法のイメージ} +{\tt eptex-xxxxx.xx.tar.bz2}内の{\tt HOWTOINST.txt}とかを見れば分かる話では +あるが,図にしておくとなにかと便利である. + +\begin{adjustvboxheight} +\small\narrowbaselines +\begin{center} +\xymatrix{\ +\texttt{../tex.web}\ar[r]&\fbox{\tt +tie}\ar[r]&\texttt{ptex.web}\ar[r]&\fbox{\tt tie}\ar[r]&(*)\\ +&\xymtt{../tex.ch}\ar[u]&\texttt{ptex.ch}\ar[ur]&\texttt{etex.ch}\ar[u]&% +{\begin{array}{c}\texttt{etex-sysdep.ch}\\\texttt{fp.ch}\end{array}}\ar[ul]\\ +&\xymtt{ptex-base.ch}\ar[ur]^-{\xymtt{tie -c ...}}& +\texttt{etex.diff}\ar[r]^-{\rm patch}&\\ +&&\texttt{../etexdir/etex.ch}\ar[r]^-{\rm cp} +&\texttt{etex.ch}\ar[uu]} +\ \\[0.5\baselineskip]\ +\xymatrix{ +(*)=\texttt{eptex.web}\ar[r]&\fbox{\tt tangle}\ar[r]& +\texttt{eptex.p}\ar[rr]^-{\rm Web2C}&&\text{{\tt tex1.c}\ etc.}% +\ar[rr]^-{\text{C compiler}}&&\texttt{eptex}\\ +&&&\texttt{pconvert.diff}\ar[u]_-{\text{patch to {\tt pconvert}}}& +\texttt{ep1.diff}\ar[r]^-{\rm patch}&\\ +&&&&&\hbox to 0zw{\hss\texttt{ptexextra.c} etc.\hss}\ar[uu] +}\ +\end{center} +\end{adjustvboxheight} + +\subsection{\WEB の実例:\texttt{ks1.web}} +このファイルがあるディレクトリ,もしくは公開場所にある{\tt ks1.web}は,僕 +が計算数学Iのレポートに書いたCarmichael数を探索するプログラム({\tt +ks1.f90}, Fortran 90)を\WEB に翻訳したものである. + +ここでは,(本来の\WEB では日本語が通らないので)松山さんの日本語版 +WEB~\cite{jpweb}を使わせてもらうことにした.この日本語版\WEB による +{\tt jtangle}, {\tt jweave}コマンドがそれぞれ{\tt tangle}, {\tt weave}の +代わりとなる. + +僕はPascalのコンパイラを所持していなかったので,Web2Cを利用してコンパ +イルを行った. +\begin{adjustvboxheight} +\narrowbaselines\small +\begin{verbatim} + [h7k doc]$ web2cdir=/home/h7k/ks2/texk/web2c/web2c + [h7k doc]$ cat $web2cdir/common.defines $web2cdir/texmf.defines ks1.p|$web2cdir/ + web2c -t -hks1-a.h -cks1 |$web2cdir/fixwrites > ks1.c + [h7k doc]$ gcc -o ks1 ks1.c +\end{verbatim} +\end{adjustvboxheight} +{\tt jtangle}, {\tt jweave}コマンドでできた{\tt ks1.p}, {\tt ks1.tex}や, +上のようにC言語に変換して得られた{\tt ks1.c}, {\tt ks1.h}も同じディレク +トリに置いておいた. +なお,{\tt ks1-a.h}というのはWeb2Cが吐くCソースを +きちんとコンパイルできるようにするための最小限の設定である. + + +\newpage +\begin{thebibliography}{99} +\bibitem{matsu3} 松山 道夫,「\TeX 読み物その3 \TeX の成立ちに関する + 諸々」.\\ +\verb+http://www.matsuand.com/downloads/texread/texread3.pdf+ +\bibitem{webman} Donald\ E.~Knuth. \textit{The \WEB\ System of + Structured Documentation}. Stanford Computer Science Report + CS980, 1983.\\ +例えば\verb+http://www.ctan.org/tex-archive/systems/knuth/WEB/WEBman.tex+ + とかにある. +\bibitem{texwiki} 奥村氏の\TeX\ wikiの「Make」の項.\\ +\verb+http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Make+ +\bibitem{etexman} The \NTS\ Team. \textit{The \eTeX\ manual}. \\ +\verb+http://www.tug.org/texlive/Contents/live/texmf-dist/doc/etex/base/etex_man.pdf+ +\bibitem{trip} Donald E. Knuth. \textit{A torture test for + \TeX}. Stanford Computer Science Report CS1027, 1984.\\ +\verb+http://ftp.yz.yamagata-u.ac.jp/pub/CTAN/systems/knuth/tex/tripman.tex+ +\bibitem{etrip} The \NTS\ Team. \textit{A torture test for \eTeX}.\\ 旧版\ +(Ver.~2) が以下にある.現在はVer.~2.2で,\TeX\ Live 2007とかには入ってい + る.\\% +\verb+http://tug.ctan.org/cgi-bin/getFile.py?fn=/systems/e-tex/v2/etrip/etripman.tex+ +\bibitem{TAOCP} Donald E.\ Knuth. +{\it The Art of Computer Programming}, Volume 2: Seminumerical +Algorithms. Addison-Wesley, third edition 1998. +\bibitem{arizawa} 有澤 誠 編,『クヌース先生のプログラム論』,共立出版, +1991 +\bibitem{jpweb} 松山 道夫,日本語版\WEB(試供版).\\ +\verb+http://www.matsuand.com/downloads/jWEB/jWEB-0.0.7.tar.gz+ +\bibitem{pascal} K.\ イェンゼン,N.\ ヴィルト 著,A.\ B.~ミケル,L.\ F.~% + マイナー 改訂,原田 賢一 訳,\\ +『情報処理シリーズ2 PASCAL 原書第4 + 版』,培風館,1981 +\bibitem{mppack} 平山 弘,高精度計算プログラムMPPACK 1.0. +\verb+http://phase.hpcc.jp/phase/mppack/+ +\bibitem{okuc} 奥村 晴彦,『C言語による最新アルゴリズム辞典』,技術評論 + 社,1991 +\bibitem{beebe} Nelson H. F. Beebe. Extending \TeX\ and \mf\ + with Floating-Point Arithmetic. \textit{TUGboat}, 28 (3), + November 2007. +\verb+http://www.math.utah.edu/~beebe/talks/2007/tug2007/tug2007.pdf+ +\bibitem{ori} 数学科3年オリエンテーション係,『2007年度 数学科オリパン + フ』,2007.9\\ +(数理266(学部生用控え室)に結構残部がある模様.) +\bibitem{okupt} 奥村 晴彦,「pTeXへの提案もどき」,2008.1.4.\\ +\verb+http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=29+ +\end{thebibliography} + +\end{document} diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/eptexdoc.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/eptexdoc.pdf Binary files differnew file mode 100644 index 00000000000..dc6b3e12103 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/eptexdoc.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/eptexdoc.tex b/Master/texmf-dist/doc/ptex/ptex-manual/eptexdoc.tex new file mode 100644 index 00000000000..ab4b9cfe169 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/eptexdoc.tex @@ -0,0 +1,1064 @@ +%#!make eptexdoc.pdf +\documentclass[a4paper,11pt]{jsarticle} +\input fam256p.tex +\usepackage[textwidth=42zw,lines=40,truedimen,centering]{geometry} +\usepackage{amsmath,mathtools,amssymb,multicol,comment} +\usepackage[dvipdfmx]{graphicx} +\usepackage[T1]{fontenc} +\usepackage{booktabs,enumitem} +\usepackage{lmodern} +\usepackage[dvipdfmx,hyperfootnotes=false]{hyperref} +\usepackage{pxjahyper} +\usepackage[bold,deluxe]{otf} +\usepackage{hologo} +\usepackage{makeidx}\makeindex + +%%%%%%%%%%%%%%%% +\makeatletter +\newcommand{\OMEGA}{$\Omega$} +\protected\def\epTeX{$\varepsilon$\nobreakdash-\pTeX} +\protected\def\eTeX{$\varepsilon$\nobreakdash-\TeX} +\def\upTeX{u\pTeX}\def\pTeX{p\kern-.15em\TeX} +\def\NTS{\leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}% + \kern-0.2emS$}\,} +\def\headfont{\normalfont\mathversion{bold}\gtfamily\bfseries} +\def\node#1{\textit{#1}} +\def\.#1{\texorpdfstring{% + \leavevmode\hbox{\texttt{\textbackslash#1}}\ifmmode\else\textcompwordmark\fi}{\textbackslash #1}} +\let\orig@cs=\. +\def\ind@cs#1{\orig@cs{#1}\indcs{#1}} +\def\indcs#1{\index{{\texttt{\textbackslash #1}}}} +\newlist{cslist}{description}1 +\setlist[cslist]{% + style=nextline,itemsep=\medskipamount,listparindent=1zw, + font=\normalfont\mdseries} +\def\csitem[#1]{\item[\llap{$\blacktriangleright$~}\let\.=\ind@cs#1]} +\def\emph#1{{\bfseries\gtfamily\mathversion{bold}#1}} +\def\listx{\def\makelabel{\hbox to 1em{\hfil\textbullet\hfil}}\def\@{\hfill} +\labelwidth=13zw\leftmargin15zw\itemindent=0zw} +\def\paragraph#1{\par\medskip\par\noindent\emph{■#1}\par\nobreak} +\def\Pkg#1{\textsf{#1}} +\catcode`\<=13 +\xspcode`\\=3 +\xspcode`\*=3 +\xspcode`\-=3 +\xspcode23=3 % \textcompwordmark +\def<#1>{\ensuremath{\langle\hbox{\normalfont\itshape #1\/}\rangle}} + +\font\man=manfnt at 10pt +\def\dbend{\raise0pt\hbox{\man\char'177}} +\AtBeginDvi{\special{pdf:mapfile otf-ipaex.map}} +\def\delbit#1#2{\underbracket[0.4pt]{#1}_{\text{#2}}} + +\def\TeXXeT{\TeX-\reflectbox{\bfseries\TeX-}} + +\newenvironment{multilist}[2]% + {$$\setbox\z@=\hbox\bgroup % catch some funny things -> \mathord + \let\a=\empty + \let\b=\empty + \count@=\z@ + \toks@={#2}% + \def\item##1\cr + {\ifnum \count@=\z@ + \count@=#1% + \expandafter\def\expandafter\b\expandafter{\b\y{}}% + \fi + \advance\count@ by\m@ne + \expandafter\def\expandafter\a\expandafter{\a\x{##1}}}% + \ignorespaces}% + {\loop + \ifnum \count@>\z@ + \expandafter\def\expandafter\a\expandafter{\a\expandafter\z\b\relax}% + \advance\count@ by\m@ne + \repeat + \def\x##1{\expandafter\y\b\relax{##1}}% + \def\y\y##1##2\relax##3% + {\ifx @##1@% + \def\b{##2\y{##3}}% + \else + \def\b{##2\y{##1&##3}}% + \fi}% + \def\z\y##1##2\relax{\def\b{##2\y{##1}}}% + \a + \def\x + {\expandafter\egroup\expandafter\halign\expandafter\bgroup + \expandafter&\the\toks@\cr}% + \def\y##1{\expandafter\def\expandafter\x\expandafter{\x##1\cr}}% + \b + \x\egroup $$} + +\makeatletter +\def\hex#1{% +{\count@=#1\@tempcnta=#1\@tempcntb=\@tempcnta\relax +\divide\@tempcntb by 16% +\ifnum\count@=0\else + \multiply\@tempcntb by16% + \advance\@tempcnta-\@tempcntb + \divide\@tempcntb by16% + \hex{\the\@tempcntb}% + \ifcase\@tempcnta\relax 0\or1\or2\or3\or4\or5\or6\or + 7\or8\or9\or A\or B\or C\or D\or E\pr F\fi +\fi}} +\clubpenalty=8000\widowpenalty=8000 + +\normalsize +\bigskipamount=\baselineskip +\medskipamount=.5\baselineskip +\smallskipamount=.25\baselineskip + +\usepackage{etoolbox} +\newenvironment{curve}{% + \par\medskip + \bgroup\small\leftskip=\dimexpr\textwidth-44zw\relax\@totalleftmargin=\leftskip + \parindent1zw\noindent\kern-\leftskip\hbox to\leftskip{\dbend\hss}% + \bigskipamount=\baselineskip + \medskipamount=.5\baselineskip + \smallskipamount=.25\baselineskip + \everypar{\everypar{}}\ignorespaces +}{\par\egroup\medskip} + +\renewenvironment{theindex}{% + \def\presectionname{}\def\postsectionname{}% + \section*{\indexname} + \@mkboth{\indexname}{\indexname}% + \plainifnotempty % \thispagestyle{plain} + \parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem + \raggedright + \begin{multicols}{2} + }{ + \end{multicols} + \clearpage + } + +\patchcmd\@verbatim\@totalleftmargin{\dimexpr\@totalleftmargin+2zw\relax}{}{} +\patchcmd\quote{\list{}}{\par\list{\topsep\medskipamount}}{}{} +\patchcmd\@verbatim{\trivlist}{\trivlist\addvspace\medskipamount\noautoxspacing}{}{} +\patchcmd\endverbatim{\endtrivlist}{\endtrivlist\addvspace\medskipamount}{}{} +\expandafter\let\csname endverbatim*\endcsname =\endverbatim +\patchcmd\verb{\ifmmode\hbox\else\leavevmode\vadjust{}\fi\bgroup} + {\ifmmode\else\leavevmode\vadjust{}\fi\hbox + \bgroup\textcompwordmark\noautoxspacing\noautospacing}{}{} +\patchcmd\verb@egroup{\egroup}{\egroup\textcompwordmark}{}{} + +\usepackage{shortvrb} +\MakeShortVerb*{|} +%%%%%%%% macros for index (simplified from doc.sty) +\newif\ifscan@allowed +\def\dotfill{\leaders\hbox to.6em{\hss .\hss}\hskip\z@ plus1fill}% +\def\pfill{\unskip~\dotfill\nobreak} + +\long\def\@footnotetext{% + \insert\footins\bgroup + \normalfont\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + \csname p@footnote\endcsname\@thefnmark + }% + \color@begingroup + \@makefntext{% + \rule\z@\footnotesep\ignorespaces}% + \futurelet\next\fo@t} +\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t + \else \let\next\f@t\fi \next} +\def\f@@t{\bgroup\aftergroup\@foot\let\next} +\def\f@t#1{#1\@foot} +\def\@foot{\@finalstrut\strutbox\color@endgroup\egroup + \ifx\pltx@foot@penalty\@undefined\else + \ifhmode\null\fi + \ifnum\pltx@foot@penalty=\z@\else + \penalty\pltx@foot@penalty + \pltx@foot@penalty\z@ + \fi + \fi} + +{\lccode`\!=`\_ +\lowercase{% +\protected\gdef\_{\ifdefstrequal{\f@family}{\ttdefault}{!}% + {\leavevmode\vrule width .45em height -.2ex depth .3ex\relax}% +}} +} +\makeatother +%%%%%%%%%%%%%%%% +\frenchspacing +\begin{document} +\title{\emph{\epTeX について}} +\author{北川 弘典\null +\thanks{\url{http://osdn.jp/projects/eptex/wiki/},\ +e-mail: \texttt{h\_kitagawa2001(at)yahoo.co.jp}}} +\date{version 190131,\today} +\maketitle +\tableofcontents + +\newpage +\section{はじめに} +\epTeX は,東京大学理学部数学科3年生対象の2007年度の授業「計算数学II」 +\footnote{\url{http://ks.ms.u-tokyo.ac.jp/}.}において北川が作成したプログ +ラムである.もともとは\pTeX~3.1.10を基盤として,\eTeX~2.2相当の機能や +10進21桁の浮動小数点演算を追加したものであったが,今では次の点が変わっている. +\begin{itemize} + \item \TeX~Live~2011に取り込まれるにあたり, + \eTeX をベースにして,その上に\pTeX 拡張やその他追加機能を載せる方針へと + 変更された. + \item 浮動小数点演算の機能は\epTeX~090927から削除されている + \footnote{% + \TeX ソース中で浮動小数点演算を行う手段としては,例えば\LaTeX3の + 機能(\Pkg{l3fp})や,\Pkg{xint}パッケージバンドルがあるので, + そちらを利用して欲しい.}. +\end{itemize} + +製作の動機や作業過程などについては,詳しくは\cite{h7k}を参照して欲しいけ +れども,大雑把に言うと,動機は以下のように要約できる. +\begin{itemize} +\item \pTeX は,\TeX が持っている「レジスタ1種類につき256個まで」という + 制限をひきずっており,現状でも非常に多数のパッケージを読み込ませた + りすると制限にぶち当たってしまう. +\item 一方,\eTeX 拡張ではこれが「レジスタ1種類につき32768個まで」と緩和 + されており,欧文で標準となっている\hologo{pdfTeX}やその後継の\hologo{LuaTeX}, + 及び\hologo{XeTeX}でも + \eTeX の機能が取り込まれている. +\item そうすると,\pTeX だけが制限をレジスタ制限を引きずっているのは世界 + から取り残されることになるのではないか. +\end{itemize} + +\section{\eTeX 拡張について} +前に述べたように,\eTeX は\TeX の拡張の一つである.\eTeX のマニュアル +\cite{etexman}には,開発目的が以下のように述べられている. + +\begin{quotation} +The \NTS\ project intends to develop an `New Typesetting System' (\NTS) +that will eventually replace today's \TeX3. The \NTS\ program will +include many features missing in \TeX, but there will also exist a mode +of operation that is 100\% compatible with \TeX3. It will, necessarily, +require quite some time to develop \NTS\ to maturity and make it widely +available. + +Meanwhile \eTeX\ intends to fill the gap between \TeX3 and the future +\NTS. It consists of a series of features extending the capabilities of +\TeX3. +\end{quotation} + +\NTS がどうなったのか僕は知らない.しかし,少なくとも\eTeX 拡張自体は実用 +的な物であり,そのせいか$\aleph$~(Aleph), \hologo{pdfTeX}, \hologo{XeTeX}などの他の拡張 +にもマージされており,ほとんどの人が\eTeX 拡張を使うことができるようになっ +ている\footnote{\LaTeXe~2017-01-01からは,\LaTeXe のフォーマット作成段階から +\eTeX 拡張が必須となった(\cite{l2e26}).}. + +\eTeX 拡張で追加される機能について,詳しくは\cite{etexman}を参照して欲し +いが,\cite{h7k}中の4.2節「\eTeX の機能」から一部改変して引用する. + +\begin{quotation} +\eTeX にはCompatibility modeとExtended modeの2つが存在し,前者では\eTeX +特有の拡張は無効になるのでつまらない.後者がおもしろい. + +拡張機能を使うにはファイル名を渡すときに\texttt{*}をつけるか +コマンドラインオプションとして\texttt{-etex}スイッチをつければいい +が,\eTeX 拡張に関わる追加マクロは当然ながらそれだけで +は駄目である.「plainマクロ for \eTeX」(\texttt{etex.fmt}というのが一番マシ +かな)では自動的に追加マクロである\texttt{etex.src}が呼ばれる.\LaTeX 下では +ちょうど\texttt{etex.src}に対応した\Pkg{etex}パッケージを読み込む必要がある. + +\paragraph{レジスタの増加} +最初に述べたように,\TeX では6種類のレジスタが各256個ずつ利用できる.それ +ぞれのレジスタには\.{dimen75}などのように0--255の番号で指定できる +他,予め別名の定義をしておけばそれによって指定することもできる.これらの +いくつかは特殊な用途に用いられる(例えば\.{count0}はページ番号などの +ように)ことになっているので,さらにuser が使えるレジスタは減少する. + +\eTeX では,追加のレジスタとして番号で言うと256--32767が使用できるよ +うになった.上のpdfによると最初の0--255と違って若干の制限はあるようだ +が,それは些細な話である.追加された(各種類あたり)$32768-256=32512$個の +レジスタは,メモリの効率を重視するためsparse registerとして,つまり,必要 +な時に始めてツリー構造の中で確保されるようになっている. + +\paragraph{式が使用可能に} +\TeX における数量の計算は充実しているとは言い難い.例えば, +\[ +\hbox{|\dimen123|}\leftarrow\frac12(\hbox{|\dimen42|}+\hbox{|\@tempdima|}) +\] +という計算を元々の\TeX で書こうとすると, +\begin{verbatim} +\dimen123=\dimen42 +\advance\dimen123by\@tempdima +\dimen123=0.5\@tempdima +\end{verbatim} +のように書かないといけない.代入,加算代入,乗算代入,除算代入ぐらいしか +演算が用意されていない状態になっている(上のコードのように,$d_2\mathrel{+\!\!=} +0.8 d_1$というような定数倍を冠することは平気). + +\eTeX では,そのレジスタの演算に,他のプログラミング言語で使われているよ +うな数式の表現が使えるようになった.上のPDFでは実例として +\begin{verbatim} +\ifdim \dimexpr (2pt-5pt)*\numexpr 3-3*13/5\relax + 34pt/2<\wd20 +\end{verbatim} +が書かれている.これは,\def\mpt{\,\mathrm{pt}} +{\catcode`\<12\[ + 32\mpt=(2\mpt-5\mpt)\left(3-\mathop{\mathrm{div}}(3\cdot 13,5)\right) ++\frac{34\mpt}{2}<\text{{\tt \char'134 box20}の幅} +\]} +が真か偽かを判定していることになる. + +\paragraph{\.{middle} primitive} +\TeX に\.{left}, \.{right}というprimitiveがあり,それを使えば括 +弧の大きさが自動調整されるのはよく知られている.\eTeX では, +さらに\.{middle}\indcs{middle}\ primitiveが追加された. + +具体例を述べる. +{\catcode`\|12 +\def\set#1#2{\setbox0=\hbox{$\displaystyle #1,#2$}% +\left\{\, \vphantom{\copy0}#1 \,\right|\!\left.\, \vphantom{\copy0}#2 \,\right\}} +\def\eset#1#2{\left\{\, #1 \,\middle|\, #2 \,\right\}} +\[ \set{n+\frac12}{n\in \omega} \eset{n+\frac12}{n\in \omega} \]} +これは以下のsourceで出力したものである: + +{\narrowbaselines +\begin{verbatim} +\def\set#1#2{\setbox0=\hbox{$\displaystyle #1,#2$}% + \left\{\, \vphantom{\copy0}#1 \,\right|\!\left.\, % + \vphantom{\copy0}#2 \,\right\}} +\def\eset#1#2{\left\{\, #1 \,\middle|\, #2 \,\right\}} +\[ \set{n+\frac12}{n\in \omega} \eset{n+\frac12}{n\in \omega} \] +\end{verbatim}} +両方とも集合の表記を行うコマンドである.\TeX 流の\.{set}では2つの +\.{left}, \.{right}の組で実現させなければならず,そのために{\catcode`\|=12$|$}の +左側と右側に入る式の最大寸法を測定するという面倒な方法を使っている.その +上,この定義では\.{textstyle}以下の数式(文中数式とか)ではそのま +ま使えず,それにも対応させようとすると面倒になる.一方,\eTeX 流の +\.{eset}では,何も考えずに +\.{left}, \.{middle}, \.{right}だけで実現できる. + +\paragraph{\TeXXeT\ \textmd{(\texttt{TeX-{}-XeT})}} +left-to-rightとright-to-leftを混植できるという機能であるらしい. +ヘブライ語あたりの組版に使えるらしいが,よく知らない. +ここでのRtoLはLtoRに組んだものを逆順にしているだけのような +気がする. + +\medskip + +とりあえず一目につきそうな拡張機能といったらこれぐらいだろうか.他にも +tracing機能や条件判断文の強化などあるが,そこら辺はパッとしないのでここ +で紹介するのは省略することにしよう. +\end{quotation} + +\epTeX ではここに述べた代表的な機能を含め,ほとんどすべての機能を実装して +いるつもりである +\footnote{% + さらに,レジスタの個数については,各種類65536個まで使えるようになっている(次節参照). +}.ただ,\TeXXeT を和文で使うと約物 +の位置がずれたり空白がおかしかったりするけれども,そこの修正は大変に思え +るし,苦労して実装する意味があるのか疑問なので放置している. + +\medskip + +\pTeX 拡張では,\TeX と比較して\node{dir\_node}と\node{disp\_node}という2種類のノードが +追加された.前者は,現在のリストの中に違う組方向のboxを挿入する際に寸法を補正するために作られ, +\.{hbox}や\.{vbox}のコンテナとなっている. +また後者は,欧文文字のベースライン補正のために使われる. + +\epTeX~110102 まではこれらのノードも\.{lastnodetype}の値として出力させるようにした. +しかし,両者ともに\epTeX が自動的に挿入する(ユーザーが意識する必要はない)ノードであることから, +\epTeX~110227以降では\node{dir\_node}と\node{disp\_node}は +\.{lastnodetype}\indcs{lastnodetype}の対象とする「最後のノード」とはならないようにしている +\footnote{% + 最後のノードが\node{dir\_node}であった場合,\.{lastnodetype}はそのノードが格納している + \node{hlist\_node}か\node{vlist\_node}の種類を返す. +}. +\begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil} +\item $-1$&none (empty list)\cr\item 0&char node\cr\item 1&hlist node\cr +\item 2&vlist node\cr\item 3&rule node\cr\item 4&ins node\cr +\item 5&mark node\cr\item 6&adjust node\cr\item 7&ligature node\cr +\item 8&disc node\cr\item 9&whatsit node\cr\item 10&math node\cr +\item 11&glue node\cr\item 12&kern node\cr\item 13&penalty node\cr +\item 14&unset node\cr\item 15&math mode nodes\cr +\end{multilist} + +\vskip-\baselineskip + +\.{currentiftype}\indcs{currentiftype}における条件判断文とそれを表す数字との対応は,以 +下のようになっている.21--28が,\pTeX 拡張で追加された条件判断文に対応する. +29の\.{ifpdfprimitive}は\hologo{pdfTeX}由来のプリミティブ(後述)である. +\begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil} +\item 1&\.{if}\cr\item 2&\.{ifcat}\cr\item 3&\.{ifnum}\cr\item 4&\.{ifdim}\cr +\item 5&\.{ifodd}\cr\item 6&\.{ifvmode}\cr\item 7&\.{ifhmode}\cr +\item 8&\.{ifmmode}\cr\item 9&\.{ifinner}\cr\item 10&\.{ifvoid}\cr +\item 11&\.{ifhbox}\cr\item 12&\.{ifvbox}\cr\item 13&\.{ifx}\cr +\item 14&\.{ifeof}\cr\item 15&\.{iftrue}\cr\item 16&\.{iffalse}\cr +\item 17&\.{ifcase}\cr\item 18&\.{ifdefined}\cr\item 19&\.{ifcsname}\cr +\item 20&\.{iffontchar}\cr\item \bf 21&\.{iftdir}\cr\item \bf 22&\.{ifydir}\cr +\item \bf 23&\.{ifddir}\cr\item \bf 24&\.{ifmdir}\cr\item \bf 25&\.{iftbox}\cr +\item \bf 26&\.{ifybox}\cr\item \bf 27&\.{ifdbox}\cr\item \bf 28&\.{ifmbox}\cr +\item \bf 29&\.{ifpdfprimtive}\cr +\end{multilist} + +\section{\OMEGA 由来の機能(旧名称:\texttt{FAM256}パッチ)} +\epTeX には,掲示板\TeX\ Q\ \&\ Aの山本氏の書き込み +\cite{yamamoto}に刺激されて作った,本節でに説明する\OMEGA の一部 +機能を使えるようにするパッチが存在する. +これは\texttt{FAM256}パッチと呼ばれ,今までは +「\epTeX 本体とは一応別扱いで,\epTeX の配布,及び +W32\TeX, \TeX~Liveのバイナリでは標準で有効になっていただけ」という扱いであったが, +それでは利用者が混乱するので +\emph{「\texttt{FAM256}パッチは\epTeX~160201以降からは切り離さない」} +とここで宣言する. +本ドキュメントの最後のページ\footnote{ただし,ソースファイルで言えば{\tt +fam256d.tex}(本文)と\texttt{fam256p.tex}(preamble部)に対応する.}にちょっ +としたサンプルを載せてある. + +本節で述べる追加機能は extendend modeでなくても有効になっている. +ただし,後に説明する「レジスタが各種類65536個まで」は, +extended modeの時に限り有効になる. + +\paragraph{数式フォント制限の緩和} +\OMEGA の大きな特徴としては,\TeX 内部のデータ構造を倍の領域を用いるよう +に改変し\footnote{詳しい話は\texttt{texk/web2c/texmfmem.h}中の共用体% +\texttt{memoryword}の定義を参照.大雑把に言うと,1つの「メモリ要素」に2つの32\,bit整 +数を同時に格納できるようになっている.},\TeX に従来から存在し +ていた「256個制限」を$2^{16}$個にまで緩和したことが挙げられる.同様に, +\OMEGA では(\cite{yamamoto}にもあるように)数式フォントを同時に256個まで +用いることができ,各フォントも65536文字まで許されるようになっている. + +\medskip + +\epTeX では,中途半端だが,数式フォント1つあたり +の使用可能文字数は256個のままで,同時に数式フォントを256個まで使えるよう +にしている.基本的には\OMEGA と同様の方法を用いているが, +内部でのデータ構造に違いがある(数字はすべてbit幅): +\begin{center} +\small\baselineskip=1.5zw +\begin{tabular}{crrrrr}% +\toprule + &category&family&char&\multicolumn{1}{c}{math code} + &\multicolumn{1}{c}{delimiter code}\\\midrule +\TeX82&3&4&8 &$3+4+8=15$ &$3+\delbit{4+8}{small}+\delbit{4+8}{large}=27$\\ +\OMEGA&3&8&16&$3+8+16=27$&$(3+\delbit{8+16}{small},\delbit{8+16}{large})=(27,24)$\\ +\epTeX&3&8&8 &$3+8+8=21$&$(3+\delbit{8+8}{small},\delbit{8+8}{large})=(19,16)$\\\bottomrule +\end{tabular} +\end{center} + +\def\bits#1{<\textup{#1}-bit\ number>} +\TeX に本来あったプリミティブは互換性維持のために同じ動作とする必要があるので, +16番から255番のフォントを利用する際には別のプリミティブが必要となる.(実装自 +体に\OMEGA の流儀を使っているから) +ここでは,\OMEGA のプリミティブ名を流用することにした. +すなわち,以下のプリミティブが追加されている\footnote{\OMEGA では\bits{8}のところが\bits{16}に +なっている.}. +\begin{cslist}[itemsep=\dimexpr-\baselineskip+\medskipamount] +\csitem[\.{omathcode} \bits{8}\texttt{=}\bits{27}]\ +\csitem[\.{omathcode} \bits{8}]\ +\csitem[\.{omathchar} \bits{27}]\ +\csitem[\.{omathaccent} \bits{27}]\ +\csitem[\.{omathchardef} <control sequence>\texttt{=}\bits{27}]\ +\csitem[\.{odelcode} \bits{8}\texttt{=}\bits{27}\ \bits{24}]\ +\csitem[\.{odelimiter} \bits{27}\ \bits{24}]\ +\csitem[\.{oradical} \bits{27}\ \bits{24}]\ +\end{cslist} +\vspace{-\baselineskip} +ここで,27\,bitとか24\,bitの自然数の意味については,上の表の +\OMEGA の行を参照して欲しい.上に書いた内部のデータ構造から推測できる通り, +\.{omathchar}等のcharacter codeの指定に使われる16\,bitの数値のうち実際に使われるのは下位 +8\,bitであり,上位8\,bitは無視される. +例えば,|\omathchar"4012345|と|\omathchar"4010045|は内部表現としては全く同じである. + +なお,|\odelcode|~\bits 8として +delimiter codeを取得しようとしても,現時点のパッチでは,うまく動作しない +\footnote{51\,bit自然数を返さないといけないですからねえ.やる気があれば +検討してみます.}. + +\medskip +\LaTeX において数式フォントを同時に16個以上使うには,|\omathchar|% +などのプリミティブに対応したマクロを使う必要がある. +最近の\pLaTeX(2016/11/29以降)はこれを部分的にサポートしていて, +\emph{\.{DeclareMathAlphabet}で使うことのできる数式用アルファベットの +上限だけは}256個に拡張されている. +% もちろんこれには最近の\LaTeX(2015/01/01以降)が必要である. +% また,少し前(2016/09/08以前)の\pLaTeX であれば +% \begin{verbatim} +% \makeatletter +% \mathchardef\e@mathgroup@top=256 +% \makeatother +% \end{verbatim} +% をプリアンブルに記述する必要があった. +だが,これだけでは記号類の定義に用いられる +|\DeclareMathSymbol|や|\DeclareMathDelimiter|が|\omathchar|や +|\odelcode|を使用しないので不十分である. +実験的と書かれてはいるが, +山本氏による「最低限のパッケージ」\cite{yamamoto3},またはこれを +最新の\LaTeX に追随してまとめ直された\Pkg{mathfam256}パッケージ +\footnote{\url{https://ctan.org/pkg/mathfam256}.}を +使うのが手っ取り早いような気がする. + +\paragraph{無限のレベル} +\TeX では,glueの伸縮量に\texttt{fil}, \texttt{fill}, \texttt{filll} +という3つの無限大のレベルが存在し,\texttt{l}が多いほど無限大のオーダーが高くなっていた. +\OMEGA では,「inter-letter spacingのために」\texttt{fi}という,有限と +\texttt{fil}の中間にあたる無限大のレベルが付け加えられた.そこで,この無限大レベル +\texttt{fi}も採用することにした. + +\medskip + +実装方法は,大まかには\OMEGA で\texttt{fi}の実装を行っているchange file\ +\texttt{omfi.ch}の通りであるのだが,これに\pTeX や\eTeX に伴う少々の修正を行っている. +\begin{itemize} +\item プリミティブ|\pagefistretch|, |\hfi|, |\vfi|を新たに定義している +\footnote{% + |\hfi|, |\vfi|については\cite{omegaman}に記述があるが, + \TeX~Liveに収録されている$\aleph$(\OMEGA は\TeX~Liveに収録されていない)では + 実装されていない.|\pagefistretch|を実装したのは北川の完全な勘違いである. +}. +\item |\gluestretchorder|, |\glueshrinkorder|の動作を\eTeX のそれと合わせた. + 具体的には,ある適当なglue~|\someglue|の伸び量を<stretch>とおくとき, +\[ + \hbox{|\gluestretchorder\someglue|}= +\begin{cases} +0&<stretch>\text{が高々\texttt{fi}レベルの量}\\ +1&<stretch>\text{がちょうど\texttt{fil}レベルの無限量}\\ +2&<stretch>\text{がちょうど\texttt{fill}レベルの無限量}\\ +3&<stretch>\text{がちょうど\texttt{filll}レベルの無限量} +\end{cases} +\] +となっている.内部では\texttt{fi}レベルが1,\texttt{fil}レベルが2,……として処 + 理している. +\end{itemize} + +\paragraph{レジスタについて} +\OMEGA では(前にも書いたが)データ構造の変更が行われ,それによってレジ +スタが各種類あたり65536個使えるようになっている. + +一方,\eTeX では,256番以降のレジスタを専用のsparse treeに格納することにより, +32767番までのレジスタの使用を可能にしていた.このツリー構造を分析してみる +と,65536個までレジスタを拡張するのはさほど難しくないことのよう +に思われた.具体的には,ツリーの階層を1つ増やしてみた(だから,おそらく +各種類あたり$16\cdot 32768=524288$個まで使えるとは思うが,これはきりが悪 +い). +そこで,\epTeX では\eTeX 流の方法を用いながらも,レジスタをさ +らに65536個まで増やしている. + +\section{\hologo{pdfTeX}由来の機能} +開発中の\LaTeX 3では,\eTeX 拡張の他に,\hologo{pdfTeX}で導入された +\.{pdfstrcmp}(又はその同等品)が必要となっており,もはや純粋な\eTeX ですら +\LaTeX 3を利用することはできない状況である (\cite{expl31,expl32,expl33}). +その他にも,\hologo{pdfTeX}由来のいくつかのプリミティブ(\cite{pdftexman})の実装が +日本の\TeX ユーザからあり, +ほとんど\hologo{pdfTeX}における実装をそのまま真似する形で実装している. + +現在の\epTeX で利用できる\hologo{pdfTeX}由来のプリミティブの一覧を以下に示す. +これらはextended modeでないと利用できない. + +\begin{cslist} + \csitem [\.{pdfstrcmp} <general text> <general text>] + 2つの引数を文字列化したものを先頭バイトから比較し, + 結果を$-1$(第1引数の方が先),0(等しい),1(第2引数の方が先)として文字列で返す. + + 比較する文字列中に和文文字がある場合には,(\epTeX の内部漢字コードにかかわらず) + UTF-8で符号化して比較する. + そのため,例えば +\begin{verbatim} +\pdfstrcmp{あ}{^^e3^^81^^83} % 「あ」はUTF-8でE38182 +\end{verbatim} + の実行結果は + {\ifdefined\UseRawInputEncoding\UseRawInputEncoding\fi + $\pdfstrcmp{あ}{^^e3^^81^^83}$}% + である\footnote{% + \LaTeX~2018-04-01以降では標準でUTF-8入力となった(|\usepackage[utf8]{inputenc}|が自動 + で行われていることに相当する)関係上,本文に述べた入力例を実行する際には + |\UseRawInputEncoding|の実行が必要になる. + }. + + \csitem[\.{pdfpagewidth}, \.{pdfpageheight}] + ページの「幅」「高さ」を表す内部長さであるが, + \emph{ここで言う「幅」は「字送り方向」のことではなく,物理的な意味である}. + + この2つの内部長さを設定するだけではdviに何の影響も与えない. + すぐ後で述べる\.{pdflastxpos}, \.{pdflastypos}による出力位置の取得 + の際の原点位置を設定するためだけに使われ,初期値は0である. + + 用紙サイズの指定には伝統的にpapersize specialが利用されてきた.それを考慮して, + papersize specialがdvi中に書き出される時,\epTeX にはその内容を解釈して + 自動的に\.{pdfpagewidth}, \.{pdfpageheight}の値を設定する機能がある + \footnote{% + papersize specialで指定した長さは常に\texttt{true}付きで解釈するのが慣習と + なっているが,\epTeX~180901より前では\texttt{true}なしの寸法として解釈するという + バグが存在した.}% + \footnote{% + dviwareによって正確な書式は異なるようだが,\epTeX~180901が解釈するpapersize specialは + 以下の文法に沿ったものになっている: +\def\<#1>{\langle\mbox{#1}\rangle} +\begin{align*} + \<special> &\longrightarrow \texttt{papersize=}\<length>\texttt{,}\<length>\\ + \<length> &\longrightarrow \<decimal> + \<optional~\texttt{true}>\<physical unit>\\ + \<decimal> &\longrightarrow \texttt{.} \mid \<digit>\<decimal> \mid + \<decimal>\<digit> +\end{align*} + 負の符号や小数点としての「\texttt{,}」,そして一切の空白を許容しないところに + 注目してほしい.また,\texttt{zw},~\texttt{zh},~\texttt{em},~\texttt{ex}という + 現在のフォントに依存する単位も使用不可能である. + }.\epTeX~180901より前ではこの機能は常に有効 + であったが,\epTeX~180901以降では内部整数 + \.{readpapersizespecial}\indcs{readpapersizespecial}(既定値は1)が正の場合のみ有効となる. + + \csitem[\.{pdflastxpos}, \.{pdflastypos}] + \.{pdfsavepos}\indcs{pdfsavepos}が置かれた場所の,dviにおける出力位置を返す内部整数(読み取り専用). + 原点はページの(物理的な意味の)左下隅であり,$y$軸は(物理的な)上方向に向かって増加する. + \begin{itemize} + \item ページの物理的な幅と高さはすぐ上の\.{pdfpagewidth}, \.{pdfpageheight}で設定する. + これらの内部長さが0であった場合は,\.{shipout}されたボックスの寸法と + \.{hoffset}(または\.{voffset})の値から自動的に計算される. + \item \pTeX では横組・縦組と組方向が複数あるので,\.{pdflastxpos}, \.{pdflastypos}の値の座標系を + 「物理的な」向きとすべきか,それとも「組方向に応じた」向きとすべきかは悩みどころである. + \epTeX~110227以降,現在までのバージョンでは上記のように物理的な向きとしている. + \item \.{mag}を用いてページの拡大縮小を行い,かつ + dvipsやdvipdfmxを用いてPostScript,~pdfを生成した場合,\.{pdflast\{x,y\}pos}の原点は + ページの左下隅から左・上方向にそれぞれ$1\,\mathrm{in}-1\,\mathrm{truein}$% + 移動したところになる + \footnote{これは\hologo{pdfTeX}のdviモードや\hologo{XeTeX}と同じ挙動である.}. + \end{itemize} + + \csitem[\.{pdfcreationdate}] + エンジン起動時の時刻を,\texttt{\pdfcreationdate}の形式で表した文字列に展開する. + これは\Pkg{standalone}パッケージを\epTeX で扱うために2013/06/05に実装されたプリミティブであるが, + 現在時刻の「秒」まで得るためにも使用できる(\TeX 82では分単位でしか取得できない). + + \epTeX においてプリミティブを実装した当初は「最初にこのプリミティブが実行された時刻を…」と + していたが,\epTeX~161030から\hologo{pdfTeX}と同じ挙動に修正した. + + \csitem[\.{pdffilemoddate} <filename>, \.{pdffilesize} <filename>] + それぞれ<filename>の更新時刻(\.{pdfcreationdate}と同じ形式)と + ファイルサイズを表す文字列に展開する. + これらも\Pkg{standalone}パッケージのために\epTeX に実装されたプリミティブである. + + \csitem[\.{pdffiledump} \textrm{[}\texttt{offset} <offset>\textrm{]}% + \ \texttt{length} <length> <filename>] + <filename>で与えられたファイル名の<offset>バイト目(先頭は0)から<length>バイトを読み込み, + 16進表記(大文字)したものに展開される. + + 本プリミティブはHeiko Oberdiek氏による\Pkg{bmpsize}パッケージを\epTeX でも使うために + 角藤さんが実装したものである(2014/05/06). + + \csitem[\.{pdfshellescape}] + \.{write18}によるshell-escapeが利用可能になっているかを示す内部整数(読み取り専用). + 0ならば不許可,1ならば許可,2ならばrestricted shell-escape% + \footnote{あらかじめ「安全」と認められたプログラム(\texttt{texmf.cnf}中で指定する) + のみ実行を許可する仕組み.}% + である. + + 本プリミティブは\TeX ユーザの集い2014でリクエストを受けて実装された(\cite{pdfse}). + + \csitem[\.{pdfmdfivesum} {[\texttt{file}]} <general text>] + 引数<general text>のMD5ハッシュ値か,あるいは\texttt{file}が指定された場合は + ファイル名が<general text>のファイルのMD5ハッシュ値を計算する. + + 前者の「引数のMD5ハッシュ値を計算する」場合には,\.{pdfstrcmp}と同じように + 和文文字をUTF-8で符号化してから計算する. + + このプリミティブは\cite{xe5}以降の議論を元に,角藤さんがリクエストしたもので, + 2015/07/04に\epTeX に実装されている. + + \csitem[\.{pdfpritimive}, \.{ifpdfprimitive}] + \.{pdfprimitive}は次に続く制御綴がプリミティブと同じ名称であった場合に, + プリミティブ本来の意味で実行させるものである.例えば +\begin{verbatim} +\pdfprimitive\par +\end{verbatim} + は,\.{par}が再定義されていようが,本来の\.{par}の意味(段落終了)となる. + また,\.{ifpdfprimitive}は,次に続く制御綴が同名のプリミティブの意味を持っていれば + 真,そうでなければ偽となる条件判断文である. + + これらのプリミティブは2015/07/15版の\Pkg{expl3}パッケージで使われた + (\cite{15715})ことを受けて実装されたものだが, + 現在ではこれらのプリミティブは使われていない. + + \csitem[\.{pdfuniformdeviate} <number>, \.{pdfnormaldeviate}] + \.{pdfuniformdeviate}は,0以上<number>未満の一様分布に従う乱数(整数値)を生成する. + \.{pdfnormaldeviate}は,平均値0,標準偏差65536の正規分布に従う乱数(整数値)を生成する. + + 現在の乱数生成の種の値は,\.{pdfrandomseed}\indcs{pdfrandomseed}で取得できる(読み取り専用). + 種の初期化にはシステムのマイクロ秒単位での現在時刻情報が使われる.また,種の値は + \.{pdfsetrandomseed} <number>\indcs{pdfsetrandomseed}によって特定の値に設定可能である. + + \LaTeX3のl3fpにおいて,2016/11/12あたりから実装された乱数生成機能(\cite{random})を + サポートするために\epTeX~161114から実装された. + + \csitem[\.{pdfelapsedtime}, \.{pdfresettimer}] + \.{pdfelapsedtime}は,エンジン起動からの経過時間を``scaled seconds''すなわち + $1/65536$秒単位で返す.この値は\.{pdfresettimer}によって再び0にリセットできる. + すぐ上の乱数生成プリミティブと同時に実装された. + + \csitem[\.{expanded} <general text>] + (\.{message}が行うのと同様に)<general text>を完全展開した結果のトークン列を返す. + + この命令は元々は\hologo{pdfTeX}に実装計画があったそうである(\cite{expanded})が, + しばらくの間\hologo{LuaTeX}にのみ実装されていた命令であった. + しかし\cite{expanded1}をきっかけに, + \hologo{pdfTeX}, \epTeX, \hologo{XeTeX}で一斉に実装された. + \epTeX~180518以降で利用可能である. +\end{cslist} + +\section{バージョン番号} +\pTeX~p3.8.0に\.{ptexversion}が実装されたのと同時に,\epTeX でもバージョン番号を +取得する\.{epTeXversion}プリミティブが\epTeX~180121から追加された. + +\begin{cslist} + \csitem[\.{epTeXversion}] + \epTeX のバージョン番号(例えば\the\epTeXversion)を内部整数で返す.\epTeX 起動時のバナーでは + \eTeX, \pTeX のバージョン番号も表示されるので,それを再現しようとすると以下のようになる. +\begin{verbatim} +This is e-pTeX, Version 3.14159265-% +p\number\ptexversion.\number\ptexminorversion\ptexrevision-% +\number\epTeXversion-\number\eTeXversion\eTeXrevision ... +\end{verbatim} + + +\end{cslist} + + +\section{\.{lastnodechar}プリミティブ} +本プリミティブは +\TeX ユーザの集い2014でリクエストを受けて +実装された(\cite{pdfse})プリミティブで,\epTeX~141119以降のextended modeで利用可能である. +詳細な背景説明・仕様は\cite{lnc}に譲る. + +\pTeX では +\begin{verbatim} +これは,\textmc{『ほげ党宣言』}の…… +\end{verbatim} +という入力からは +\begin{quote} +これは,\textmc{『ほげ党宣言』}の…… +\end{quote} +という出力が得られ,コンマと二重鍵括弧の間が全角空きになってしまうことが以前から知られている. + +この現象は,(展開し続けた結果)「,」の直後のトークンが「『」ではないことによって, +「,」の後の半角空きと,「『」の前の半角空きが両方 +入ってしまうという\pTeX の和文処理の仕様 +\footnote{% + \TeX82 の欧文のカーニングや合字処理も同じような仕様になっている. + 例えば\texttt{W\.{relax}\ oWo}からはW\relax oWoという出力になり, + Wとoの間のカーニングが\.{relax}によって挿入されなくなったことがわかる. +}による. +min10フォントメトリックで「ちょっと」を組むと「ょっ」の間が詰まるという不具合は有名であるが, +「|ちょ{}っと|」と空グループを挟むことで回避されるのも,同じ理由である. + +\medskip + +\.{lastnodechar}プリミティブは, +上で述べた「書体変更命令を間に挟むと和文間グルーが『まともに』ならない」という状況を +改善する助けになることを目指して実装された. + +\begin{cslist} + \csitem[\.{lastnodechar}] + 現在構築中のリストの「最後のノード」が文字由来であれば,そのコード番号(内部コード)を内部整数として返す. + + 上記「最後のノード」では,\pTeX によって自動挿入される + \begin{itemize} + \item JFMによって入るグルー + \item 行末禁則処理のために挿入されるペナルティ + \item 欧文文字のベースライン補正用のノード + \end{itemize} + は無視される.また,「最後のノード」が欧文文字のリガチャであった場合は,リガチャそれ自身のコード番号ではなく, + 最後の構成要素の文字のコード番号を返す.「最後のノード」が文字を表すものでなかった場合は,$-1$が返る. +\end{cslist} + +例えば,\.{lastnodechar}を使って +\begin{verbatim} +これは,\the\lastnodechar\textmc{『ほげ党宣言』}…… +\end{verbatim} +と入力すると, +\begin{quote} +これは,\the\lastnodechar\textmc{『ほげ党宣言』}…… +\end{quote} +のようになり,\.{lastnodechar}実行時の「最後のノード」(文字「,」を表す)の内部コード +\footnote{% + 内部コードがEUCの場合は$\texttt{"A1A4} = 41380$,SJISの場合は + $\texttt{"8143} = 33091$となる. +}が得られる.これによって,\.{textmc}等の命令の直前の文字を知ることができるので, +あとは\TeX マクロ側でなんとかできるだろう,という目論見である. + + +また,上記の説明にあるとおり, +\begin{verbatim} +abcfi\the\lastnodechar, abc\char"1C \the\lastnodechar +\end{verbatim} +は +\begin{quote} +abcfi\the\lastnodechar, abc\char"1C \the\lastnodechar +\end{quote} +となり,見た目では同じ「fi」が\.{lastnodechar}実行時の「最後のノード」であるかのように見えても, +それが合字の場合(左側)では\.{lastnodechar}の実行結果は最後の構成要素「i」のコード番号105となる. + +\begin{curve} + 「|これは,|」とソース中に入力したときの + ノードの状態を\.{showlists}で調べてみると次のようになっており, + 本当に一番最後のノードはJFMによって挿入される二分空きの空白 + (「,」と通常の和文文字の間に入るはずのもの)であることがわかる. +\begin{verbatim} +### yoko direction, horizontal mode entered at line 465 +\hbox(0.0+0.0)x9.24683 +\JY1/hmc/m/it/10 こ +\JY1/hmc/m/it/10 れ +\JY1/hmc/m/it/10 は +\penalty 10000(for kinsoku) +\JY1/hmc/m/it/10 , +\glue(refer from jfm) 4.62341 minus 4.62341 +\end{verbatim} + しかし,数段落上の説明の通り,\.{lastnodechar}は\pTeX の和文処理によって自動的に挿入された + これらJFM由来の空白を無視する. +\end{curve} + +「最後のノード」を見ているので, +\begin{verbatim} +これは,\relax\sffamily{}\the\lastnodechar\textmc{『ほげ党宣言』}…… +\end{verbatim} +などとノードに関係しないものが途中にあっても,それは単純に無視されて +\begin{quote} +これは,\relax\sffamily{}\the\lastnodechar\textmc{『ほげ党宣言』}…… +\end{quote} +となる. + +\section{\.{lastnodesubtype}プリミティブ} +\cite{tjb28,plt63}などの議論で,「最後のグルーがJFMグルーだけ\.{unskip}する」処理の必要性が +唱えられてきた.\epTeX にはもともと最後のノードの種別を返す\.{lastnodetype}プリミティブが +あったが,これでは最後のノードがグルーであるかしかわからない. +そのため,\epTeX~180226で\.{lastnodesubtype}プリミティブを追加した. + +\begin{cslist} + \csitem[\.{lastnodesubtype}] + 現在構築中のリストの「最後のノード」(\.{lastnodechar}プリミティブと同様)の + subtype値を内部整数として返す. +\begin{itemize} + \item 「最後のノード」が文字ノードのときは0が返る. + \item 現在構築中のリストが空のときは$-1$が返る. +\end{itemize} +\end{cslist} + +実際に有用なのは,以下の場合であろう: + \begin{description} + \item[最後のノードがグルー($\.{lastnodetype}=11$)のとき] +\begin{multilist}{3}{\hfil\hskip1.5em#:&\quad#\hfil} +\item 0&明示的な\.{hskip}, \.{vskip}\cr +\item 1&\.{lineskip}\cr +\item 2&\.{baselineskip}\cr +\item 3&\.{parskip}\cr +\item 4&\.{abovedisplayskip}\cr +\item 5&\.{belowdisplayskip}\cr +\item 6&\.{abovedisplayshortskip}\cr +\item 7&\.{belowdisplayshortskip}\cr +\item 8&\.{leftskip}\cr +\item 9&\.{rightskip}\cr +\item 10&\.{topskip}\cr +\item 11&\.{splittopskip}\cr +\item 12&\.{tabskip}\cr +\item 13&\.{spaceskip}\cr +\item 14&\.{xspaceskip}\cr +\item 15&\.{parfillskip}\cr +\item 16&\.{kanjiskip}\cr +\item 17&\.{xkanjiskip}\cr +\item 18&\.{thinmuskip}\cr +\item 19&\.{medmuskip}\cr +\item 20&\.{thickmuskip}\cr +\item 21&JFM由来グルー\cr +\item 98&\.{nonscript}\cr +\item 99&\.{mskip}\cr +\item 100&\.{leaders}\cr +\item 101&\.{cleaders}\cr +\item 102&\.{xleaders}\cr +\end{multilist} + \item[最後のノードがカーン($\.{lastnodetype}=12$)のとき] + \leavevmode +\begin{multilist}{3}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil} +\item 0&カーニング\cr +\item 1&明示的な\.{kern}\cr +\item 2&アクセント由来\cr +\item 3&イタリック補正\.{/}\cr +\item 99&\.{mkern}\cr +\end{multilist} + \item[最後のノードがペナルティ($\.{lastnodetype}=13$)のとき] + \leavevmode +\begin{multilist}{2}{\hfil\hskip1.5zw#:&\quad#\qquad\hfil} +\item 0&明示的な\.{penalty}\cr +\item 1&\.{jcharwidowpenalty}\cr +\item 2&禁則処理由来\cr +\end{multilist} + \end{description} + +しかし,本プリミティブは +\epTeX 内部で使用しているsubtypeの値をそのまま返すだけであるので, +具体的な数値は将来変わる恐れがある.そのため, +\begin{verbatim} +\ifdefined\ucs\jfont\tenmin=upjisr-h at 9.62216pt +\else\jfont\tenmin=min10\fi +\tenmin\char\jis"214B\null\setbox0\lastbox%" +\global\chardef\pltx@gluetype\lastnodetype +\global\chardef\pltx@jfmgluesubtype\lastnodesubtype +\end{verbatim} +のように\TeX ソース内から取得・保存しておくことが望ましい. + +\medskip +なお\pLaTeX~2018-04-01以降では,上記のコードを利用して +「最後のグルーがJFMグルーのときだけ消す」命令|\removejfmglue|を +\begin{verbatim} +\protected\def\removejfmglue{% + \ifnum\lastnodetype=\pltx@gluetype\relax + \ifnum\lastnodesubtype=\pltx@jfmgluesubtype\relax + \unskip + \fi\fi} +\end{verbatim} +として定義している. + +\section{\.{epTeXinputencoding}プリミティブ} +現在読み込んでいるファイルの文字コードを切り替えるプリミティブであり, +2016/02/01に阿部紀行さんによって実装された.詳細は実装者の解説記事 +\cite{eptexinputenc}を参照してほしいが,おおまかに述べると以下のようになるだろう. + +\begin{cslist} + \csitem[\.{epTeXinputencoding} <encoding>] + 現在読み込んでいるファイルの文字コードを<encoding>に変更する. + 実際に変更されるのは「次の行」であり,また現在のファイルからさらに\.{input}等で + 読まれたファイルには効力を及ぼさない. + + <encoding>の値は,基本的には\pTeX の\texttt{-kanji}オプションで指定できる値 + (\texttt{euc}, \texttt{sjis}, \texttt{jis}, \texttt{utf8})である. +\end{cslist} + +\begin{comment} + \section{互換性} +\eTeX, \pTeX との互換性をはかるのに有効な手段としては,まず\texttt{TRIP} +testがある.\cite{h7k}にも書いたが,これは\TeX のソースの全行を実行する +ようなテストソースであり,\texttt{TRIP} testの実行結果が違えば,どこかの +動作が違っていることが分かるという仕掛けである. + +幸いにも,\epTeX の(compatibility modeにおける)\texttt{TRIP} testの実行結果は,\pTeX のそれとほとん +ど同じであり,違う点は以下のみであった: +\begin{itemize} +\item \texttt{Memory usage}の違い: +\begin{alltt} + Memory usage before: \(x\,\)&\(\,y\); after: \(z\,\)\&\(\,w\); still untouched: \(u\) +\end{alltt} +のところで,$x$, $z$が4多く,$u$が4少ない. +\item (\texttt{FAM256}パッチのおかげで)数式フォントが256個同時に +扱えるようになったことによる,エラーの未発生やエラーメッセージの違い. +\item ログの最後に出てくる,メモリ総使用量. +\end{itemize} +また,extended modeと +compatibility modeによる出力の違いを検証すると,Memory usageの違いやメモリ総使用量の他に +は,\texttt{e-TRIP}の説明書p.\ 4の項目4.にある違いしか見受けられなかった, + +\par\vskip0.5\baselineskip\par + +次に,\eTeX には,\eTeX によって拡張された部分を調べる,同様の +\texttt{e-TRIP} testが存在する.\pTeX 系列では,|\showbox|などでい +ちいち組方向を表示するので,それを +\begin{verbatim} + $ alias sep='sed "s/, yoko direction//;s/yoko direction, //;\ + s/yoko(math) direction, //"' +\end{verbatim} +というaliasを利用することでlog fileから除去し,それと\eTeX での +\texttt{e-TRIP} testの出力と比べた結果, +\begin{itemize} +\item Memory Usageの違い(略) +\item レジスタの使用可能個数を65536個/種類としたことによるエラーの未発生 +\item (和文文字のため)character codeに256以上も許すことによる + エラーの未発生. +\end{itemize} +という違いを得た. + +\par\vskip0.5\baselineskip\par + +すると,最後に,\pTeX 特有の拡張部分のテストをしたくなるわけだが,北川の +知る限りにおいては,そのようなテストソースは公式には存在しないようである. +しかし,やはり気になる問題であり{\tiny (さる方面から圧力もきたので)}, +個人的に作ってみたものが\texttt{ptex-qtrip}である.詳細な説明はそちらの +ドキュメントに譲る.ともかく,これを動作させてlog fileを比べてみると,メ +モリ関連や\texttt{FAM256}関連以外は +\begin{verbatim} + -% split2 to -0.01802,6.94444 p=-10000 + +% split2 to -0.01806,6.94444 p=-10000 +\end{verbatim} +以外の違いしかなかった.わずか$0.00004$の違い(単位がもしpointだとしたら +$3$\,sp)だが,どこか気になるところである. + +上の箇所もあるし,また\texttt{ptex-qtrip}自体がまだ完全なものではなのだ +が,\pTeX と\epTeX は実用上においては互換と言えそうな気もしなくもない. + +\end{comment} + +\begin{thebibliography}{99} + \bibitem{h7k} 北川 弘典,「計算数学II 作業記録」,2008.\\ + \url{https://osdn.jp/projects/eptex/document/resume/ja/1/resume.pdf}ほか, + 本pdfと同じディレクトリにある\texttt{resume.pdf}がそれにあたる. + \bibitem{yamamoto} 山本 和義,「数式famの制限とluatex」,掲示板「\TeX\ + Q\ \&\ A」,2009/02/12.\\ + \url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52744.html} + \bibitem{yamamoto2} 山本 和義,「Re: 数式famの制限とluatex」,掲示板「\TeX\ + Q\ \&\ A」,2009/02/16. + \url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52767.html} +\bibitem{yamamoto3} 山本 和義,「数式fam拡張マクロ for e-pTeX等」,掲示板「\TeX\ + Q\ \&\ A」,2009/02/21. + \url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52799.html} +\bibitem{expl31} 河原,「パッケージとディストリビューションについて」,掲示板「\TeX\ + Q\ \&\ A」,2010/12/16. + \url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55464.html} + \bibitem{expl32} 角藤 亮,「Re: パッケージとディストリビューションについて」,掲示板「\TeX\ + Q\ \&\ A」,2010/12/19. + \url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55478.html} + \bibitem{expl33} zrbabbler,「LaTeX3 と expl3 パッケージ」,ブログ「マクロツイーター」内 + ,2010/12/22. + \url{http://d.hatena.ne.jp/zrbabbler/20101222/1293050561} + \bibitem{strcmp} 角藤 亮,「Re: e-pTeX 101231」,掲示板「\TeX\ + Q\ \&\ A」,2011/01/01.\\ + \url{http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55528.html} + \bibitem{pdfse} Dora TeX,「Re: |\pdfshellescape|, + |\lastnodechar| の実装」,\TeX~Forum,2014/11/19. + \url{http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1435#p8053} + \bibitem{lnc} 北川 弘典,「|\lastnodechar| プリミティブについて」,2014/12/15.\\ + \url{https://ja.osdn.net/projects/eptex/wiki/lastnodechar} + \bibitem{xe5} Joseph Wright, ``[XeTeX] |\(pdf)mdfivesum|'', + 2015/07/01,\\ + \url{http://tug.org/pipermail/xetex/2015-July/026044.html} + \bibitem{15715} tat tsan,「[expl3 / e(u)ptex] 2015/07/15 版 expl3 パッケージが + 、(u)platex で通らない」,\TeX~Forum,2015/07/26.\\ + \url{http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1632} + \bibitem{random} Joseph Wright, ``[tex-live] Random number primitives'', + 2016/11/12,\\ + \url{http://tug.org/pipermail/tex-live/2016-November/039436.html} + \bibitem{eptexinputenc} 阿部 紀行,「2016年2月2日」,2016/02/02.\\ + \url{http://abenori.blogspot.jp/2016/02/e-ptexeptexinputencoding.html}. + \bibitem{etexman} The \NTS\!\ Team. \textit{The \eTeX\ manual} (v2.0). \\ + |$TEXMFDIST/doc/etex/base/etex_man.pdf| + \bibitem{omegaman} J.\ Plaice, Y.\ Haralambous. \textit{Draft + documentation for the $\it\Omega$ system}, 1999.\\ + |$TEXMFDIST/doc/omega/base/doc-1.8.tex| + \bibitem{pdftexman} H\`an Th\'{\^e} Th\`anh et al. \textit{The + \hologo{pdfTeX}\ user manual}, 2015.\\ + |$TEXMFDIST/doc/pdftex/manual/pdftex-a.pdf| +\bibitem{l2e26} + The \LaTeX3 Project Team, \textit{\LaTeX\ News Issue 26}, 2017.\\ + |$TEXMFDIST/source/latex/base/ltnews26.tex|, \\ + \url{https://www.latex-project.org/news/latex2e-news/ltnews26.pdf}. +\bibitem{tjb28} 北川 弘典, + 「[ptex] |\inhibitglue|の効力」,2017/09/20.\\ + \url{https://github.com/texjporg/tex-jp-build/issues/28}. +\bibitem{plt63} Dora TeX, + 「p 指定の tabular でのセル冒頭の |\relax\par|」,2018/02/19.\\ + \url{https://github.com/texjporg/platex/issues/63}. + \bibitem{expanded1} Joseph Wright, + ``[tex-live] Primitive parity, |\expanded| and |\Ucharcat|'', + 2018/05/04,\\ + \url{http://tug.org/pipermail/tex-live/2018-May/041599.html} +\bibitem{expanded} + Joseph Wright, ``A `new' primitive: |\expanded|'', 2018/12/06.\\ + \url{https://www.texdev.net/2018/12/06/a-new-primitive-expanded} +\end{thebibliography} + +\newpage +\printindex + +\newpage\scrollmode +\input fam256d.tex + +\newpage +\end{document} diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/fam256d.tex b/Master/texmf-dist/doc/ptex/ptex-manual/fam256d.tex new file mode 100644 index 00000000000..65f820d8ab2 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/fam256d.tex @@ -0,0 +1,160 @@ +\begin{center} + \Large\bfseries + Test source for \texttt{FAM256} patch +\end{center} + + +本ソースは山本和義氏による「数式famの制限とluatex」(qa:52744)中のコー +ドをベースにしたものである. + +\bigskip + +\paragraph{More than 16 math font families.} +\font\fontA=cmr10 +$ +\mbfa{A} +\mbfb{B} +\mbfc{C} +\mbfd{D} +\mbfe{E} +\mbff{F} +\mbfg{G} +\mbfh{H} +\mbfi{I} +\mbfj{J} +\mbfk{K} +\mbfl{L\ fam=\the\fam\ }$ + +$ +\mbfaa{Aa} +\mbfab{Ab} +\mbfac{Ac} +\mbfad{Ad} +\mbfae{Ae} +\mbfaf{Af} +\mbfag{Ag} +\mbfah{Ah} +\mbfai{Ai} +\mbfaj{Aj} +\mbfak{Ak} +\mbfal{Al} +\mbfam{Am} +\mbfan{An} +\mbfao{Ao} +\mbfap{Ap\ fam\the\fam\ } +$ + +$ +\mbfba{Aa} +\mbfbb{Ab} +\mbfbc{Ac} +\mbfbd{Ad} +\mbfbe{Ae} +\mbfbf{Af} +\mbfbg{Ag} +\mbfbh{Ah} +\mbfbi{Ai} +\mbfbj{Aj} +\mbfbk{Ak} +\mbfbl{Al} +\mbfbm{Am} +\mbfbn{An} +\mbfbo{Ao} +\mbfbp{Ap\ fam\the\fam\ } +$ + +$ +\mbfca{Aa} +\mbfcb{Ab} +\mbfcc{Ac} +\mbfcd{Ad} +\mbfce{Ae} +\mbfcf{Af} +\mbfcg{Ag} +\mbfch{Ah} +\mbfci{Ai} +\mbfcj{Aj} +\mbfck{Ak} +\mbfcl{Al} +\mbfcm{Am} +\mbfcn{An} +\mbfco{Ao} +\mbfcp{Ap\ fam\the\fam\ } +$ + +$ +\mbfda{Aa\ fam\the\fam\ } +\mbfdb{Ab\ fam\the\fam\ } +\mbfdc{Ac\ fam\the\fam\ } +\mbfdd{Ad\ fam\the\fam\ } +% +\ \textfont255=\fontA \fam255 roman +$ + +\medskip + +\paragraph{\.{omathchar}\ etc.} +\omathcode`<="3460065 +\mathcode`>="4065 +\xdef\lx{\odelimiter"4450068"030001} +\odelcode`[="410074"03000B +${\tt \verb|\mathchar"7F25|:\ }\mathchar"7F25,\ +{\tt \verb|\omathchar"7420125|:\ } +\omathchar"7420125$ + +{\tt meaning of \verb|\langle|:\ \meaning\langle}, + +{\tt meaning of \verb|\lx|:\ \meaning\lx} + + +${\tt \verb|\lx|:\ }\lx,\ +{\tt \verb|\bigl\lx|:\ } \bigl\lx,\ +{\tt \verb|\Bigl\lx|:\ } \Bigl\lx$ + + +{\tt \verb+\the\mathcode`\f+:\ \hex{\the\mathcode`\f}}, +{\tt \verb+\the\omathcode`\f+:\ \hex{\the\omathcode`\f}}(どちらも16進に +変換した) + +$\left[\right.\bigl[\Bigl[\Bigr)\bigr)) <>$ + +$\radical"270370{}$,\ $\oradical"460070"030074{} $\ +$\radical"270370{a}$,\ $\oradical"460070"030074{a} $\ +$\radical"270370{\int_V f\,d\mu}$,\ $\oradical"460070"030074{\int_V f\,d\mu} $ + +\medskip + +\.{odelcode} primitiveによる\emph{delimiter codeの取得}はうまく動かない:\\ +{\tt \verb+\the\delcode`\|+:} ${\the\delcode`\|}$, +{\tt \verb+\the\odelcode`\|+:} ${\the\odelcode`\|}$(どちらも10進) + +\medskip + +\paragraph{Infinite level ``fi''} +\def\na{\hskip 0pt plus 1fi({\tt fi})\hskip 0pt plus 1fi} +\def\nb{\hskip 0pt plus 1fil({\tt fil})\hskip 0pt plus 1fil} +\def\nc{\hskip 0pt plus 1fill({\tt fill})\hskip 0pt plus 1fill} +\def\nd{\hskip 0pt plus 1filll({\tt filll})\hskip 0pt plus 1filll} +\fbox{\hbox to 14cm{■\na ■\nb ■\nc ■\nd ■}} + +\fbox{\hbox to 14cm{■\na ■\nb ■\nc ■}} + +\fbox{\hbox to 14cm{■\na ■\nb ■}} + +\fbox{\hbox to 14cm{■\na ■\na\na ■}} + + + +\paragraph{65536 registers} +\leavevmode +{\tracingall +\setbox40000=\hbox to 10mm{fuga!}\copy40000 +{\setbox40000=\hbox to 10mm{a}\copy40000 + {\setbox40000=\hbox to 10mm{漢字仮名}\copy40000} +\global\setbox40000=\hbox to 10mm{asdf}}\copy40000 +{\setbox40000=\hbox to 10mm{\TeX}\copy40000 + {\setbox40000=\hbox to 10mm{ほげほげ}\copy40000}\copy40000}} + +\count34656=465\count45486=124 +\advance\count34656 by\count45486 +\the\count34656\nonstopmode diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/fam256p.tex b/Master/texmf-dist/doc/ptex/ptex-manual/fam256p.tex new file mode 100644 index 00000000000..56808f63d4c --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/fam256p.tex @@ -0,0 +1,75 @@ +\makeatletter +\mathchardef\e@mathgroup@top=256 +\makeatother + + + +\DeclareMathAlphabet{\mbfa}{OT1}{cmr}{m}{n} +\DeclareMathAlphabet{\mbfb}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfc}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfd}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfe}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbff}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfg}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfh}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfi}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfj}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfk}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet{\mbfl}{OT1}{cmr}{bx}{n}% ここで15番 + +\DeclareMathAlphabet{\mbfaa}{OT1}{cmtt}{m}{n} % 16 +\DeclareMathAlphabet{\mbfab}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfac}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfad}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfae}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfaf}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfag}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfah}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfai}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfaj}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfak}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfal}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfam}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfan}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfao}{OT1}{cmtt}{m}{n} +\DeclareMathAlphabet{\mbfap}{OT1}{cmtt}{m}{n} + +\DeclareMathAlphabet{\mbfba}{OT1}{cmss}{m}{it} % 32 +\DeclareMathAlphabet{\mbfbb}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbc}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbd}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbe}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbf}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbg}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbh}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbi}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbj}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbk}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbl}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbm}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbn}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbo}{OT1}{cmss}{m}{it} +\DeclareMathAlphabet{\mbfbp}{OT1}{cmss}{m}{it} + +\DeclareMathAlphabet{\mbfca}{OT1}{ptm}{m}{n} % 48 +\DeclareMathAlphabet{\mbfcb}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcc}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcd}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfce}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcf}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcg}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfch}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfci}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcj}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfck}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcl}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcm}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcn}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfco}{OT1}{ptm}{m}{n} +\DeclareMathAlphabet{\mbfcp}{OT1}{cmr}{bx}{n} + +\DeclareMathAlphabet{\mbfda}{OT1}{phv}{m}{n} % 64 +\DeclareMathAlphabet{\mbfdb}{OT1}{pcr}{m}{n} +\DeclareMathAlphabet{\mbfdc}{OT1}{pag}{m}{n} +\DeclareMathAlphabet{\mbfdd}{OT1}{ppl}{m}{n} + diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/jfm.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/jfm.pdf Binary files differnew file mode 100644 index 00000000000..2a499781a45 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/jfm.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/jfm.tex b/Master/texmf-dist/doc/ptex/ptex-manual/jfm.tex new file mode 100644 index 00000000000..1f23731cc38 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/jfm.tex @@ -0,0 +1,239 @@ +\documentclass[twoside]{jarticle} +\addtolength{\textwidth}{0.9in} +\setlength{\oddsidemargin}{.4in} +\setlength{\evensidemargin}{.4in} +\pagestyle{headings} +\title{JFMファイルフォーマット} +\author{ASCII Corporation \& Japanese \TeX\ Development Community} +\begin{document} +\maketitle + +\section{JFM file format} +JFMファイルのフォーマットは、 +基本的にはTFMファイルのフォーマットに準拠しており、 +TFMを拡張した形になっている。 +ここでは、主にその拡張部分について説明を行い、 +その他の部分に関しては、 +\TeX\ the program等のTFMの説明を参照してもらいたい。 + +この文書はもともと株式会社アスキーが開発したp\TeX{}に付属していた +ものである。2018年に日本語\TeX{}開発コミュニティはJFMフォーマットを +拡張したため、その内容について追記してある。 + +\subsection{JFMファイルの構成} +JFMファイル全体の構成は、 +Table~\ref{構成}(\pageref{構成}ページ)に示すとおりである。 \\ +ここでTFMと異なるのは次の点である。 +\begin{enumerate} +\item {\it char\_type}のテーブルが付け加えられたこと。 +\item {\it exten}の換わりに{\it glue}のテーブルが設けられたこと。 +\item 2に関連して、{\it lig\_kern}から{\it glue\_kern}テーブルへ変更されたこと。 +\item これらに伴い、先頭のファイル内の各部分を規定する + パラメータ表が変更されている。 + また、オリジナルのTFMとの区別のためにidを付加している。 +\end{enumerate} +最初の7ワードは半ワード(=2バイト)ずつに区切られ、 +JFMファイルを構成する14個の要素のサイズが収められている。 +これらの値は、すべて$2^{15}$よりも小さい非負の値で、 +次の条件を満たしていなければならない: +\begin{eqnarray*} +bc &=& 0 \\ +lf &=& 7 + lh + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ng + np +\end{eqnarray*} + +\subsection{char\_type} +今回の\TeX の日本語化においては、同一の文字幅、 +高さ前後に挿入されるグルー等、その文字が持つ属性全てが +同じものを、1つの{\it `char\_type'}として英字フォントの1キャラクタと +同様にして扱うようにしている。 +そこで、漢字の文字コードとこの{\it char\_type}との対応付けを +このテーブルを使って行う。 + +このテーブルの各エントリーは1ワード(=4バイト)で構成され、 +上位3バイトに漢字コード、下位1バイトにキャラクタタイプを持つ +\footnote{これが日本語\TeX{}開発コミュニティによって2018年1月に導入された +新仕様である;オリジナルのアスキーによる仕様では、「上位半ワードに +漢字コード、下位半ワードにキャラクタタイプを持つ」というものであった。 +p\TeX{}では内部処理にJISが用いられ、JFMで扱う漢字コードは2バイトが +上限だったため十分であったが、up\TeX{}でBMP超えの3バイトの文字を +JFMで扱うことを目的に仕様拡張した。}。 +漢字コードは、それが16進数24bit(3バイト)で0xABcdefと表されるとき、 +{\it char\_type}テーブルには{\tt cd ef AB}として格納される +\footnote{オリジナルの仕様では、下位半ワードにキャラクタタイプを +格納していたが、キャラクタタイプの上限は255なので、実はその上位バイトは +常に{\tt 00}であった。このことを利用し、日本語\TeX{}開発コミュニティの +新仕様では「この{\tt 00}が実は漢字コードの上位だった」ということに +して、3バイト(U+10000以上)の漢字コードで不足する1バイトを確保した。 +これにより、新仕様はオリジナルの仕様の上位互換であることが保証されている。}。 +テーブル内にはコードの値の順番に収められていなければならない。 +またこのテーブルの先頭には、デフォルトのインデックスとして +漢字コード及びキャラクタタイプの項が0のものが、 +必ず1つ存在しなければならず、このテーブルに登録されていない文字は、 +キャラクタタイプが0として扱う。 +つまり、このデフォルト以外の文字幅、カーン等の属性を持つキャラクタ +のコードとタイプが2番目以降のエントリーとして存在しなければならない。 + +\subsection{char\_info} +{\it char\_type}をインデックスとしてこのテーブルを +参照することにより、各{\it char\_type}の属性を検索する。 +各テーブルへのインデックス等の情報を次の順番でパッキング +して1ワードに収めてある。 +\begin{description} +\item{{\it width\_index} (8bits)} width\_tableへのインデックス +\item{{\it height\_index} (4bits)} height\_tableへのインデックス +\item{{\it depth\_index} (4bits)} depth\_tableへのインデックス +\item{{\it italic\_index} (6bits)} italic\_tableへのインデックス +\item{{\it tag} (2bits)} + \begin{description} + \item{${\it tag}=0$} {\it remainder}の項は無効であり + 使用しないことを示す。 + \item{${\it tag}=1$} {\it remainder}の項が{\it glue\_kern}への有効な + インデックスであることを示す。 + \item{${\it tag}=2, 3$} JFMでは使用していない。 + \end{description} +\item{remainder (8bits)} +\end{description} +JFMでは$bc$は必ずゼロ\footnote{前節にある通り、漢字コード及び +キャラクタタイプの項が0のものが必ず1つ存在するため。}なので、 +1つのJFMに含まれる{\it char\_info}は全部で$ec+1$ワードになる。 + +\subsection{glue\_kern} +特定のキャラクタタイプの組み合せ時に挿入すべき{\it glue}又は{\it kern}を +簡単なプログラム言語によって指定する。 +各命令は、以下の4バイトで構成される。 +\begin{description} +\item{第1バイト({\it skip\_byte})} + \begin{itemize} + \item 128より大きいとき\\ + 現在のワードが{\it char\_info}から示された最初のワード + である場合は、実際の{\it glue\_kern}プログラムが + {\it glue\_kern}[$256*{\it op\_byte}+{\it remainder}$]から + 収められている(すなわち、再配置されている)ことを示す + \footnote{「再配置」は、サイズが256を超える大きな + {\it glue\_kern}テーブルを格納するための方策であり、 + 欧文TFMの{\it lig\_kern}テーブルにおけるそれと同様である。 + 2018年2月に日本語\TeX{}開発コミュニティによって、 + p\TeX{}及びpPLtoTFで新たにサポートされた。}。 + 最初のワードでない場合(すなわち、既に再配置先あるいは + プログラムのステップを開始した後のワードである場合)は、 + その場でプログラムを終了する。 + \item 128のとき\\ + このワードを実行してプログラムを終了する。 + \item 128より小さいとき\\ + このワードを実行した後、次のステップまでスキップする + ワード数を示す + \footnote{「スキップ」(SKIP)は、元々アスキーの公式ページ + {\tt http://ascii.asciimw.jp/pb/ptex/tfm/jfm.html}に文書化 + されてはいたが、実際には(p)PLtoTFの{\it glue\_kern}テーブル内で + SKIP命令を使用することができず、p\TeX{}もやはりSKIP命令を + サポートしていなかった。 + 2018年2月の日本語\TeX{}開発コミュニティの改修により、 + 新たにサポートが開始された。}。 + \end{itemize} +\item{第2バイト({\it char\_type})} + \begin{itemize} + \item 次の文字のキャラクタタイプが、 + このバイトで示すキャラクタタイプ + \footnote{ここにキャラクタタイプが格納されるため、 + キャラクタタイプの上限は255なのである。}と同じ場合、 + 第3バイトの処理を実行し、プログラム終了。 + \item そうでなければ次のステップへ。 + \end{itemize} +\item{第3バイト({\it op\_byte})}\\ + この値によってグルーを扱うかカーンを扱うかを規定する。 + \begin{itemize} + \item 127以下の場合{\it glue[remainder$\times$3]}のグルーを挿入。 + \item 128以上の場合{\it kern[remainder]}のカーンを挿入。 + \end{itemize} +\item{第4バイト({\it remainder})}\\ + 第3バイトにより規定される + {\it glue}または{\it kern}へのインデックスを示す。 +\end{description} +% +\subsection{glueテーブル} +自然長、伸び長、縮み長の3ワードで1つのグルーを構成する +(したがって、$ng$は必ず3の倍数となる)。 +各値は、$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]} p\TeX{}でzhで参照される寸法。 +\item{param[6]} p\TeX{}でzwで参照される寸法。 +\item{param[7][8][9]} 漢字と英字間に挿入するグルーのデフォルト値。 +\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|}{param} \\ +\multicolumn{2}{|c|}{}\\ \hline +\end{tabular} +\end{minipage} +\begin{minipage}[b]{3.3in} +\noindent +\begin{tabular}{l} +$id=$ JFM\_ID number. ($=11$ for yoko, $9$ for tate) \\ +$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. ($=0$ for JFM) \\ +$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/ptex-manual/jtex_asciimw.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/jtex_asciimw.pdf Binary files differnew file mode 100644 index 00000000000..f4672369842 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/jtex_asciimw.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/jtex_asciimw.tex b/Master/texmf-dist/doc/ptex/ptex-manual/jtex_asciimw.tex new file mode 100644 index 00000000000..d2baa874fe6 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/jtex_asciimw.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{xkanjiskip}}というレジスタを +設け、その値を使う。 +さらに、全角文字の前後に現れる半角文字の内の何れに対して、 +スペースを挿入すべきかを指定するために、 +内部に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/ptex-manual/jtexdoc_asciimw.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/jtexdoc_asciimw.pdf Binary files differnew file mode 100644 index 00000000000..b44ec169d50 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/jtexdoc_asciimw.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/jtexdoc_asciimw.tex b/Master/texmf-dist/doc/ptex/ptex-manual/jtexdoc_asciimw.tex new file mode 100644 index 00000000000..203a1aa6882 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/jtexdoc_asciimw.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{inhibitxspcode}`?=0\\ + \cs{inhibitxspcode}`(=2\\ + \cs{inhibitxspcode}`)=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}$は、アスキーコードで `f' を示すわけですから禁則の対象文字 + とはなっていないはずです。 + + したがって、今のままでは `\{' のような文字に対して自動的に禁則処理や + グルーの自動挿入を行うことは不可能です。 +\end{itemize} +%% cmsy の \{ は 0x6E でなく 0x66 (2001/08/24) +\end{document} diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.pdf Binary files differindex 89fd915be79..b07f8a175b6 100644 --- a/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.pdf +++ b/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.tex b/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.tex index b6806860b7a..f48e8bc8252 100644 --- a/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.tex +++ b/Master/texmf-dist/doc/ptex/ptex-manual/ptex-manual.tex @@ -2,7 +2,8 @@ \documentclass[a4paper,11pt,nomag]{jsarticle} \usepackage[textwidth=42zw,lines=40,truedimen,centering]{geometry} \usepackage{amsmath} -\usepackage{array}\usepackage[arrow]{xy} +\usepackage{array}\usepackage[all]{xy} +\SelectTips{cm}{} %\usepackage[dvipdfmx]{graphicx} \usepackage[T1]{fontenc} \usepackage{booktabs,enumitem,multicol} @@ -134,6 +135,10 @@ \fi \fi} +\def\tsp{_{\mbox{\fontsize\sf@size\z@\ttfamily \char32}}} +\def\tpar{_{\mbox{\fontsize\sf@size\z@\ttfamily \string\par}}} +\def\tign{_{\mbox{\fontsize\sf@size\z@\selectfont --}}} + \usepackage{shortvrb} \MakeShortVerb*{|} @@ -167,37 +172,52 @@ e-mail: \texttt{issue(at)texjp.org}}} ここでは,\pTeX の日本語組版の概略と,それを実現するために導入された プリミティブを説明する. -\section{文字コードの指定} -\TeX82では「文字コードの範囲」は0--255であった. -一方,\pTeX では「文字コードを引数にとるプリミティブ」といっても,状況によって -\begin{itemize} - \item 欧文文字の文字コード0--255をとる(例:|\catcode|) - \item 和文文字の内部コードをとる(例:|\inhibitxspcode|) - \item 上記2つのどちらでもとれる(例:|\prebreakpenalty|) -\end{itemize} -のいずれの場合もありうる. +\section{\pTeX で利用可能な文字} -\medskip +\TeX82で扱える文字コードの範囲は0--255であった. +\pTeX ではこれに加えてJIS X 0208の文字も利用可能であり, +以上の文字集合が欧文文字と和文文字に区別されて扱われる. -本ドキュメントでは上のどれかを明示するために,以下のような記法を採用する. -\begin{description} - \item[<8-bit number>] 0--255の範囲内の整数 - \item[<kanji code>] 和文文字の内部コード - \item[<character code>] 0--255の範囲内の整数,および和文文字の内部コード - \item[<16-bit number>] 0--65535の範囲内の整数 -\end{description} +[TODO] 欧文文字とは何か,和文文字とは何か + +% https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=460#p2422 +% あたりによると,以下のようになるが,今も正しいのか? +% +% \pTeX への入力は,「7ビットASCII文字集合」に「ISO-2022-JP (jis),EUC-JP (euc), +% Shift-JIS (sjis)またはUTF-8 (utf8)のいずれかでエンコードされた +% JIS X 0208の文字集合」を加えたものとして解釈される. -\pTeX の内部コードはEUC-JPかShift-JISのいずれかである.和文文字の内部コードとして +\pTeX は,入力をEUC-JPまたはShift-JISのいずれか(後述)の +内部コードに変換して取り扱う.和文文字の内部コードとして 許される整数は$256c_1+c_2$,但し$c_i\in C_i$であり,ここで \begin{description} - \item[内部コードがEUC-JPのとき] $C_1=C_2=\{\hex{a1},\dots,\hex{fe}\}$. - \item[内部コードがShift-JISのとき] - $C_1=\{\hex{81},\dots,\hex{9f}\}\cup\{\hex{e0},\dots,\hex{fc}\}$,\\ - $C_2=\{\hex{40},\dots,\hex{7e}\}\cup\{\hex{80},\dots,\hex{fc}\}$. + \item[内部コードがEUC-JPのとき] + $C_1=C_2=\{\hex{a1},\dots,\hex{fe}\}$. + \item[内部コードがShift-JISのとき] + $C_1=\{\hex{81},\dots,\hex{9f}\}\cup\{\hex{e0},\dots,\hex{fc}\}$,\\ + $C_2=\{\hex{40},\dots,\hex{7e}\}\cup\{\hex{80},\dots,\hex{fc}\}$. \end{description} である. -\begin{dangerous} -\pTeX の内部コードは\pTeX 起動時のバナーから分かる.例えば + +% この内部コードのパターンに合えば和文文字として扱われ, +% 合わなければ欧文文字として扱われる,でよい? + +% http://tutimura.ath.cx/ptexlive/?ptexenc%2FDetails +% http://ajt.ktug.org/assets/2008/5/1/0201tsuchimura_kuroki.pdf +% https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=460 + +入力ファイルの文字コードがUTF-8の場合,JIS X 0208にない文字は +UTF-8のバイト列として読み込まれる. + +\pTeX の入力ファイルの文字コードは,起動時のオプション|-kanji|によって +変更できる(可能な値は|utf8|,|euc|,|sjis|,|jis|). +同様に,内部コードは|-kanji-internal|オプションによって変更できる +(可能な値は|euc|,|sjis|)が,こちらはini modeでのフォーマット作成時 +に限られ,virtual modeでは不可である(フォーマットの内部コードと実際の +処理の整合性をとるため,\pTeX\ p3.8.2以降の仕様). + +\pTeX の入力ファイルの文字コードと内部コードは起動時のバナーから分かる. +例えば \begin{verbatim} This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) (preloaded format=ptex) @@ -207,14 +227,167 @@ This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) \item 入力ファイルの(既定)文字コードはUTF-8(但し,JIS X 0208の範囲内) \item \pTeX の内部コードはEUC-JP \end{itemize} -という情報が見て取れる. +という情報が見て取れる.入力ファイルの文字コードと内部コードが同じ場合は, +\begin{verbatim} +This is pTeX, Version 3.14159265-p3.8.0 (sjis) (TeX Live 2018) +(preloaded format=ptex) +\end{verbatim} +のように表示される(この例は,入力ファイルの文字コードと内部コードが +ともにShift-JISの場合). + +\begin{dangerous} +上にはこのように書いたが, +極めて細かい話をすれば,起動時のバナーは時にウソをつくので注意. +ログファイルには記録されるバナーは常に正しい.これは以下の事情による. + +virtual modeでは,起動直後にバナーを表示してから,フォーマットファイル +読込が行われる.この時点で初めて,起動時の内部コードとフォーマットの +内部コードの整合性が確認される.ここでもし合致しなかった場合は,\pTeX は +警告を表示してフォーマットに合った内部コードを選択し,以降の処理を行う. +ログファイルはこの後にオープンされるため,そこには正しい内部コード +(フォーマットと同じ内部コード)が書き込まれる\cite{build55}. + +このようなウソは,\pTeX に限らず|(preloaded format=***)|でも見られる. \end{dangerous} -\TeX82と同様に,バッククオート(|`|)を使って「|`あ|」のようにして和文文字の内部コードを +[TODO] \pTeX の内部コードはEUC-JPかShift-JISのいずれかであるが, +DVIファイル内の和文文字コードとしてはJISコードを出力する. + +\section{文字コードの取得と指定} + +\pTeX でも\TeX82と同様に, +バッククオート(|`|)を使って「|`あ|」のようにして和文文字の内部コードを 内部整数として得ることができる.欧文文字については,1文字の制御綴を 代わりに指定することができた(例えば,「|`b|」と「|`\b|」は同じ意味だった)が, 同じことを和文文字に対して「|`\あ|」などと行うことはできない. +\pTeX では「文字コードを引数にとるプリミティブ」といっても,状況によって +\begin{itemize} + \item 欧文文字の文字コード0--255をとる(例:|\catcode|) + \item 和文文字の内部コードをとる(例:|\inhibitxspcode|) + \item 上記2つのどちらでもとれる(例:|\prebreakpenalty|) +\end{itemize} +のいずれの場合もありうる. + +\medskip + +本ドキュメントでは上のどれかを明示するために,以下のような記法を採用する. +\begin{description} + \item[<8-bit number>] 0--255の範囲内の整数 + \item[<kanji code>] 和文文字の内部コード + \item[<character code>] 0--255の範囲内の整数,および和文文字の内部コード + \item[<16-bit number>] 0--65535の範囲内の整数 +\end{description} + +\section{和文文字と\.{kcatcode}} +\TeX82では,各文字に0--15のカテゴリーコードを割り当てており, +\TeX82の入力プロセッサは「どのカテゴリーコードの文字が来たか」で状態が遷移する +有限オートマトンとして記述できる(\cite{topic}). +\pTeX では,和文文字には +16~($\mathit{kanji}$), 17~($\mathit{kana}$), 18~($\mathit{other\_kchar}$)の +カテゴリーコードの3つのいずれかが +割り当てられており,\pTeX の入力プロセッサの状態遷移図は +\autoref{fig:ptex_input}のように\TeX82のそれを拡張したものになっている. + +\autoref{fig:ptex_input}を見れば分かるように, +(欧文文字直後の改行は空白文字扱いされるのと対照的に) +\emph{和文文字直後の改行は何も発生しない}.和文文字の直後にグループ開始・終了が来て +行が終わった場合も同様である. + + +\begin{figure}[b] +\small +\[ +\entrymodifiers={++[o][F-]} +\xymatrix{% + *\txt{}&*\txt{}&*\txt{}&*\txt{}\\ + *\txt{}\ar[r]& + \textit{N} \ar@(ur,ul)[rr]^{1,2,7,13,E} + \ar[u]^{5\tpar, 14} + \ar@(d,l)[]^{9\tign,10\tign} + \ar@/_3em/[ddrr]^(0.55){J} + \ar[dr]^(0.4){0}&*\txt{} + &\textit{M} + \ar[u]^-{5\tsp,14}\ar@/_.5em/[dd]_(0.7){J} + \ar@/_3em/[lldd]_(0.85){10} + \ar@(u,r)[]^{1,2,7,9\tign,13,E} + \ar@/_1ex/[dl]_0&*\txt{}\\ + *\txt{}&*\txt{}&*+[F-]\txt{\mbox{制御綴読み取り}} + \ar@{-->}@/^.5em/[dl]\ar@{-->}@/_1ex/[ur]\\ + *\txt{}& + \textit{S}\ar@/^.5em/[ur]^-(0.4){0} + \ar[d]^-{5,14} + \ar@(d,l)^{9\tign,10\tign} + \ar@(d,d)@/_3em/[rr]_{J} + \ar@/_3em/[uurr]_(0.3){1,2,7,13,E}&*\txt{}& + \textit{K}\ar[ul]^(0.3){0}\ar@/_.5em/[uu]_{7,13,E} + \ar@/^1.5em/[ll]^{10} + \ar@(d,r)[]_{1,2,9\tign,J} + \ar[d]_-{5,14} + &*\txt{}\\ + *\txt{}&*\txt{}&*\txt{}&*\txt{} +% +} +\] +\begin{itemize} + \item 矢印の上下に書いた数字はカテゴリーコードを表す. + \item ``E''はカテゴリーコード3, 4, 6, 8, 11, 12の文字達を, + ``J''は和文文字を表す. + \item ``$5\tpar$''のような下付き添字は「挿入するトークン」を表している. + 但し,``$9\tign$'', ``$10\tign$''はその文字を無視することを示している. + \item 図中央の「制御綴読み取り」の後で$S$,~$M$どちらの状態になるかは, + 次のように決まっている: + \begin{itemize} + \item 制御綴が「|\ |」のようなカテゴリーコード10の文字 + からなるコントロールシンボルのときは状態$S$に遷移する. + \item 制御綴が「|\#|」「|\】|」のようなその他のコントロールシンボルのときは状態$M$に遷移する. + \item 制御綴がコントロールワードのときは状態$S$に遷移する. + \end{itemize} +\end{itemize} +\caption{\pTeX の入力プロセッサの状態遷移図} +\label{fig:ptex_input} +\end{figure} + +和文文字のカテゴリーコードの値による動作の違いは次のようになる: +\begin{itemize} + \item \TeX82では,「複数文字からなる命令」(コントロールワード)には + カテゴリーコードが11~($\mathit{letter}$)の文字しか使用できないことになっていたが, + \pTeX では16,~17の和文文字も合わせて使用することができる. + \item 一方,カテゴリーコードが18の和文文字はコントロールワード中には使用できない. + 「|\】|」のように一文字命令(コントロールシンボル)に使用することはできる + \footnote{「|\】|」のように和文文字からなるコントロールシンボルを文字列化する際に, + バージョンp3.7.2以前の\pTeX では「|\】 |」と後ろに余計な空白文字を補ってしまうという問題があった. + \TeX~Live 2018の\pTeX~p3.8.1でこの問題は修正された(\cite{build37}). + + また,バージョンp3.8.1以前では + 「|\】|」のような和文のコントロールシンボルで行が終わった場合,「|\!|」のような + 欧文コントロールシンボルと同様に改行由来の空白が追加されてしまい, + 和文文字直後の改行は何も発生しないという原則に反していたが, + こちらは\TeX~Live 2019の\pTeX~p3.8.2で修正された(\cite{build37}). + }. + \item 後で説明する|\jcharwidowpenalty|は,カテゴリーコードが16,~17の和文文字の前にのみ + 挿入されうるもので,カテゴリーコードが18の和文文字の前には挿入されない. + \item 欧文文字は\TeX82と同様に1つの文字トークンはカテゴリーコード$c$と文字コード$s$の組 + み合わせ($256c+s$)で表現されていた.\pTeX では和文文字トークンは文字コードのみで表現さ + れ,そのカテゴリーコードは随時算出されるようになっている + \footnote{\upTeX では和文文字トークンについてもそのカテゴリーコードの情報が + 含まれるようになった.}. +\end{itemize} + +\begin{cslist} + \csitem[\.{kcatcode} <character code>=<16--18>] + |\kcatcode|はDVI中の上位バイト(すなわち,JISコードでいう区ごと)に値が設定可能である. + 初期状態では1,~2, 7--15, 85--94区の文字が18,3--6区の文字が17,16--84区の文字が16である. +\end{cslist} +\begin{dangerous} + |\kcatcode|では欧文文字の文字コード(0--255)も指定することができるが, + その場合「0区扱い」として扱われる + \footnote{\pTeX の処理でこの「0区」の|\kcatcode|が使われることはないので, + 事実上は「16--18のどれかを格納可能な追加レジスタ」程度の使い方しかない.}. + + なお,\upTeX においては,|\kcatcode|は大きく仕様変更されている. +\end{dangerous} + % jtex.tex の「ラインブレーク」を簡略化 \section{禁則} 欧文と和文の処理で見かけ上最も大きな違いは,行分割処理であろう. @@ -263,7 +436,8 @@ This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) 直後に10000のペナルティが付けられ,行末禁則文字の対象となる. \end{cslist} -和文文字,欧文文字の区別無しに指定できる.また,同一の文字に対して +|\prebreakpenalty|, |\postbreakpenalty|は +和文文字,欧文文字の区別無しに指定できるが,同一の文字に対して 両方のペナルティを同時に与えるような指定はできない (もし両方指定された場合,後から指定されたものに置き換えられる). 禁則テーブルには256文字分の領域しかないので, @@ -375,7 +549,7 @@ This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) \end{dangerous} \begin{cslist} -\csitem[\.{xkanjiskip}] +\csitem[\.{xkanjiskip}=<skip>] 和文文字と欧文文字の間に標準で入るグルーを設定する. 段落途中でこの値を変えても影響はなく, 段落終了時の値が段落全体にわたって用いられる. @@ -458,7 +632,7 @@ This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) \begin{itemize} \item メトリック由来の空白が挿入されないだけであり, その代わりに|\kanjiskip|や|\xkanjiskip|が挿入されることは禁止していない. - \item 本命令は現在が(非限定,限定問わず)水平モードのときしか効力を発揮しない + \item 本命令は現在のモードが(非限定,限定問わず)水平モードのときしか効力を発揮しない (数式モードでも効かない). 段落が和文文字「\verb+【+」で始まり,その文字の直前にメトリック由来の空白が入ることを抑止 したい場合は,次のように一旦段落を開始してから|\inhibitglue|を実行する必要がある. @@ -466,8 +640,40 @@ This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) \leavevmode\inhibitglue 【 \end{verbatim} \end{itemize} + 以前の\pTeX では「この命令が実行された位置」が何を指すのか大雑把でわかりにくかったが, + \TeX~Live 2019の\pTeX~p3.8.2以降では,明確に\emph{新たなノードが追加されない限り},と + 定めた(\cite{build28,forum_2566}).すなわち, + \begin{enumerate} + \item |\inhibitglue|は,ノード挿入処理を行う命令 + (|\null|,~|\hskip|, |\kern|, |\vrule|,~\dots)が後ろに来た場合は無効化される. + \item 一方,|\relax|やレジスタへの代入などのノードを作らない処理では無効化されない. + \item |\inhibitglue|の効果は別レベルのリストには波及しない. + \end{enumerate} \end{cslist} \begin{dangerous} + 以上の説明の具体例を以下に示す: + + \medskip\noindent + \begin{minipage}[t]{.8\linewidth} + \begin{verbatim} + )\vrule(\\ + )\vrule\inhibitglue(\\ + )\inhibitglue\vrule(\\ + )\inhibitglue\relax(\\ + )\relax\inhibitglue(\\ % 「)」「\relax」間で二分空きが入る + あ\setbox0=\hbox{\inhibitglue}( + \end{verbatim} + \end{minipage}\hfill + \begin{minipage}[t]{.1\linewidth} + )\vrule(\\ + )\vrule\inhibitglue(\\ + )\inhibitglue\vrule(\\ + )\inhibitglue\relax(\\ + )\relax\inhibitglue(\\ + あ\setbox0=\hbox{\inhibitglue}( + \end{minipage} +\end{dangerous} +\begin{dangerous} p\LaTeX~2017-10-28以降では,|\inhibitglue|の短縮として|\<|が次のように 定義されている(|\protected|は\eTeX 拡張の機能だが,現在では\LaTeX 自体が \eTeX 拡張を要求している). @@ -475,6 +681,13 @@ This is pTeX, Version 3.14159265-p3.8.0 (utf8.euc) (TeX Live 2018) \protected\def\<{\ifvmode\leavevmode\fi\inhibitglue} \end{verbatim} \end{dangerous} +\begin{cslist} +\csitem[\.{disinhibitglue}] + |\inhibitglue|の効果を無効化(つまり,メトリック由来の空白の挿入を許可)する. + \pTeX~p3.8.2で新しく追加された. +\end{cslist} + + \section{組方向} @@ -687,7 +900,7 @@ DtoU方向での数式ディレクションはそれぞれ非数式の場合と ベースライン補正量をどうするかを常に気にしないといけない. 例えば次のコードを考える: \begin{verbatim} - \ybaselineshift=10pt\scriptbaselineshifyfactor=700 + \ybaselineshift=10pt\scriptbaselineshiftfactor=700 漢字pqr$a\hbox{xあ}^{% b\hbox{\scriptsize yう} \hbox{\scriptsize\ybaselineshift=7pt zえ} @@ -754,33 +967,7 @@ $10\,\mathrm{pt}-7\,\mathrm{pt}=3\,\mathrm{pt}$だけ上に配置されてしま |\jfont|で「和文の横組用フォント」を, |\tfont|で「和文の縦組用フォント」を返す. \end{itemize} - -\csitem[\.{kcatcode} <character code>=<16--18>] - \pTeX では,和文文字に - 16~($\mathit{kanji}$), 17~($\mathit{kana}$), 18~($\mathit{other\_kchar}$)の - いずれかのカテゴリーコードを割り当てている. - これらの値による動作の違いは次のようになる: -\begin{itemize} - \item \TeX82では,「複数文字からなる命令」(control word)には - カテゴリーコードが11~($\mathit{letter}$)の文字しか使用できないことになっていたが, - \pTeX では16,~17の和文文字も合わせて使用することが出来る. - カテゴリーコードが18の和文文字はcontrol word中には使用できない - \footnote{但し「|\】|」のように一文字命令(control symbol)としての使用は可能である.}. - \item 前で説明した|\jcharwidowpenalty|は,カテゴリーコードが16,~17の和文文字の前にのみ - 挿入されうるもので,カテゴリーコードが18の和文文字の前には挿入されない. -\end{itemize} - - |\kcatcode|はDVI中の上位バイト(すなわち,JISコードでいう区ごと)に値が設定可能である. - 初期状態では1,~2, 7--15, 85--94区の文字が18,3--6区の文字が17,16--84区の文字が16である. \end{cslist} -\begin{dangerous} - |\kcatcode|では欧文文字の文字コードも指定することができ, - その場合「0区扱い」として扱われる - \footnote{\pTeX の処理でこの「0区」の|\kcatcode|が使われることはないので, - 事実上は「16--18のどれかを格納可能な追加レジスタ」程度の使い方しかない.}. - - なお,\upTeX においては,|\kcatcode|は大きく仕様変更されている. -\end{dangerous} \section{文字コード変換,漢数字} @@ -818,12 +1005,28 @@ p3.1.2で復活したという経緯がある.}. \end{verbatim} は「{\kansujichar1=`壱 \kansujichar2=\euc"C6F5\relax \kansujichar3=\jis"3B32\relax \kansuji 1234}」と出力される. + なお,|\kansuji|に続く数値<number>が負の場合は,空文字列になる + (ちょうど|\romannumeral|にゼロまたは負の値を与えた場合と同様). + + |\kansujichar|で指定できるのは「和文文字の内部コードとして有効な値」であり, + 無効な値(例えば\pTeX では,|`A|は欧文文字コードであり,和文文字コードではない) + を指定すると +\begin{verbatim} +! Invalid KANSUJI char ("41) +\end{verbatim} + というエラーが発生する\footnote{\upTeX では0--127も含め, + Unicodeの文字コードすべてが和文文字コードとして有効であり + (|\kchar|で任意の文字コードを和文文字ノードに変換して出力できる), + 基本的にこのエラーは発生しない.}. \end{cslist} % luatexja.dtx より pTeX 用に移植 -以上に挙げたプリミティブ(|\kuten|, |\jis|, |\euc|, |\sjis|, |\kansuji|)は -内部整数を引数にとるが,実行結果は\emph{文字列}であることに注意. -また,\pTeX はJIS X 0213には対応せず,JIS X 0208の範囲のみ扱える. +\begin{dangerous} + 以上に挙げたプリミティブ(|\kuten|, |\jis|, |\euc|, |\sjis|, |\kansuji|)は + 展開可能(expandable)であり, + 内部整数を引数にとるが,実行結果は\emph{文字列}であることに注意 + (\TeX82の|\number|, |\romannumeral|と同様). + また,\pTeX はJIS X 0213には対応せず,JIS X 0208の範囲のみ扱える. \medskip\noindent \begin{minipage}{.6\linewidth} @@ -843,6 +1046,26 @@ p3.1.2で復活したという経緯がある.}. \kansuji1701 \end{minipage}\medskip + 以上の挙動から,|\kansuji|を + 「整数値をその符号値をもつ和文文字トークンに変換する」という目的に + 用いることもでき\footnote{ただし,\upTeX で + 0--127の文字コードを|\kansujichar|で指定した場合のみ, + |\kansuji|で生成されるトークンは欧文文字トークンになる\cite{build36}.}, + これは時に“|\kansuji|トリック”と呼ばれる.例えば +\begin{verbatim} + \kansujichar1=\jis"2422 \edef\X{\kansuji1} +\end{verbatim} + としておけば,|\expandafter\meaning\X|は「\texttt{% + \kansujichar1=\jis"2422 \edef\X{\kansuji1}% + \expandafter\meaning\X}」であるし, +\begin{verbatim} + \begingroup \kansujichar5=\jis"467C\relax \kansujichar6=\jis"4B5C\relax + \expandafter\gdef\csname\kansuji56\endcsname{test} + \endgroup +\end{verbatim} + とすれば,|\日本|という和文の制御綴をASCII文字だけで定義できる. +\end{dangerous} + \section{長さ単位} \pTeX では\TeX82に加えて以下の単位が使用可能である: @@ -932,11 +1155,11 @@ p3.1.2で復活したという経緯がある.}. \begin{cslist} \csitem[\.{char} <character code>, \.{chardef} <control sequence>=<character code>] - 引数として0--255に加えて和文文字の内部コードも指定できる. - 和文文字の内部コードを指定した場合は和文文字を出力する. -\csitem[\.{accent} <character code>=<character>] - |\accent|プリミティブにおいても,アクセントの部分に和文文字の内部コードを指定できるほか, - アクセントのつく親文字を和文文字にすることもできる. + 引数として0--255に加えて和文文字の内部コードも指定できる. + 和文文字の内部コードを指定した場合は和文文字を出力する. + \csitem[\.{accent} <character code>=<character>] + |\accent|プリミティブにおいても,アクセントの部分に和文文字の内部コードを指定できるほか, + アクセントのつく親文字を和文文字にすることもできる. \end{cslist} \begin{itemize} @@ -953,10 +1176,65 @@ p3.1.2で復活したという経緯がある.}. \end{itemize} \end{itemize} +\begin{cslist} + \csitem[\.{if} <token$_1$> <token$_2$>, \.{ifcat} <token$_1$> <token$_2$>] + 文字トークンを指定する場合,その文字コードは\TeX82では0--255のみが許されるが, + \pTeX では和文文字トークンも指定することができる. + + |\if|による判定では,欧文文字トークン・和文文字トークンともに + その文字コードが比較される. + |\ifcat|による判定では,欧文文字トークンについては|\catcode|, + 和文文字トークンについては|\kcatcode|が比較される. + % [TODO] TeX Live 2018 の upTeX では, + % ^^ab 形式での文字コード指定は欧文扱いされるので, + % \ifcat 判定では \catcode が読み出される. + % 例えば \showthe\kcatcode`^^b0 では 18 が返るが, + % 和文扱いはされないことに注意. + % https://github.com/texjporg/tex-jp-build/issues/68 +\end{cslist} + +\begin{dangerous} +\TeX bookには,オリジナルの\TeX における|\if|と|\ifcat|の説明として +\begin{quote} +If either token is a control sequence, +\TeX\ considers it to have character code 256 and category code 16, +unless the current equivalent of that control sequence +has been |\let| equal to a non-active character token. +\end{quote} +とある.すなわち +\begin{quote} +|\if|や|\ifcat|の判定では(実装の便宜上) +コントロールシークエンスは文字コード256, +カテゴリーコード16を持つとみなされる +\end{quote} +というのである.ところが,tex.webの実装はこの通りでなく, +コントロールシークエンスをカテゴリーコード0とみなしている. +そのため,\pTeX 系列において和文文字トークンの|\kcatcode|の値が +16である場合も,|\ifcat|判定でコントロールシークエンスと混同されることはない. +\end{dangerous} + \begin{thebibliography}{99} + \bibitem{topic} Victor Eijkhout, \textit{\TeX\ by Topic, A \TeX nician's Reference}, + Addison-Wesley, 1992.\\ + \url{https://www.eijkhout.net/texbytopic/texbytopic.html} \bibitem{tatemath} aminophen, 「縦数式ディレクションとベースライン補正」, 2016/09/05,\\ \url{https://github.com/texjporg/platex/issues/22} + \bibitem{build28} h-kitagawa, 「[ptex] |\inhibitglue|の効力」, + 2017/09/20,\\ + \url{https://github.com/texjporg/tex-jp-build/issues/28} + \bibitem{build36} aminophen, 「欧文文字の|\kansujichar|,|\inhibitxspcode|」, + 2017/11/26,\\ + \url{https://github.com/texjporg/tex-jp-build/issues/36} + \bibitem{build37} aminophen,「和文のコントロールシンボル」, + 2017/11/29,\\ + \url{https://github.com/texjporg/tex-jp-build/issues/37} + \bibitem{build55} aminophen,「[(u)pTeX] 内部コードの -kanji-internal オプション」, + 2018/04/03,\\ + \url{https://github.com/texjporg/tex-jp-build/issues/55} + \bibitem{forum_2566} aminophen, 「\TeX~Live 2019 での |\inhibitglue| の挙動変更【予定】」, + 2019/02/06,\\ + \url{https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2566} \end{thebibliography} \newpage diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/ptexdoc_asciimw.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/ptexdoc_asciimw.pdf Binary files differnew file mode 100644 index 00000000000..ab1dc9ab54e --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/ptexdoc_asciimw.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/ptexdoc_asciimw.tex b/Master/texmf-dist/doc/ptex/ptex-manual/ptexdoc_asciimw.tex new file mode 100644 index 00000000000..05a7cbdd558 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/ptexdoc_asciimw.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 \jcharwidowpenalty) + \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 \jcharwidowpenalty) + \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/ptex-manual/ptexskip_asciimw.pdf b/Master/texmf-dist/doc/ptex/ptex-manual/ptexskip_asciimw.pdf Binary files differnew file mode 100644 index 00000000000..fc89e00a914 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/ptexskip_asciimw.pdf diff --git a/Master/texmf-dist/doc/ptex/ptex-manual/ptexskip_asciimw.tex b/Master/texmf-dist/doc/ptex/ptex-manual/ptexskip_asciimw.tex new file mode 100644 index 00000000000..183e3691fd5 --- /dev/null +++ b/Master/texmf-dist/doc/ptex/ptex-manual/ptexskip_asciimw.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} |