%#!make eptexdoc.pdf \documentclass[a4paper,11pt,nomag,dvipdfmx]{jsarticle} \usepackage[bold,deluxe]{otf} \input fam256p.tex \usepackage[textwidth=42zw,lines=40,truedimen,centering]{geometry} %%%%%%%%%%%%%%%% % additional packages \usepackage{amsmath} \usepackage{mathtools,amssymb,comment} \usepackage[dvipdfmx]{graphicx} \usepackage{lmodern} \usepackage[T1]{fontenc} \usepackage{booktabs,enumitem,multicol} \usepackage[hyperfootnotes=false]{hyperref} \usepackage{pxjahyper} \usepackage{hologo} \usepackage{makeidx}\makeindex % common \usepackage{ptex-manual} %%%%%%%%%%%%%%%% \def\delbit#1#2{\underbracket[0.4pt]{#1}_{\text{#2}}} \usepackage{shortvrb} \MakeShortVerb*{|} %%%%%%%%%%%%%%%% \makeatletter {\lccode`\!=`\_ \lowercase{% \protected\gdef\_{\ifdefstrequal{\f@family}{\ttdefault}{!}% {\leavevmode\vrule width .45em height -.2ex depth .3ex\relax}% }} } \makeatother \clubpenalty=8000 \widowpenalty=8000 \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 \the\epTeXversion,\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 を和文で使うと約物 の位置がずれたり空白がおかしかったりするけれども,そこの修正は大変に思え るし,苦労して実装する意味があるのか疑問なので放置している. 以下,\eTeX 拡張を\pTeX 拡張とマージするにあたって調整した箇所を述べる. \begin{cslist} \csitem[\.{lastnodetype} (read-only integer)] \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}の対象とする「最後のノード」とはならないようにしている \footnote{% 最後のノードが\node{dir\_node}であった場合,\.{lastnodetype}はそのノードが格納している \node{hlist\_node}か\node{vlist\_node}の種類を返す. }.\\ \parbox{.9\linewidth}{% \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}} \csitem[\.{currentiftype} (read-only integer)] 条件判断文とそれを表す数字との対応は以下のようになっている (\epTeX~190709以降). 21,~22は\hologo{pdfTeX}由来の条件判断文(後述), 23--32が\pTeX 拡張で追加された条件判断文に対応する.\\ \parbox{.9\linewidth}{% \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&\.{ifincsname}\cr\item \bf 22&\.{ifpdfprimtive}\cr \item \bf 23&\.{iftdir}\cr\item \bf 24&\.{ifydir}\cr \item \bf 25&\.{ifddir}\cr\item \bf 26&\.{ifmdir}\cr\item \bf 27&\.{iftbox}\cr \item \bf 28&\.{ifybox}\cr\item \bf 29&\.{ifdbox}\cr\item \bf 30&\.{ifmbox}\cr \item \bf 31&\.{ifjfont}\cr\item \bf 32&\.{iftfont}\cr \end{multilist}} \csitem[\.{fontcharwd}, \.{fontcharht}, \.{fontchardp}, \.{fontcharic} (dimension)] 基本的にフォント内の文字の寸法を内部長さとして返す命令であるが, 欧文フォントと和文フォントを判別し,それに応じて処理が分かれる. それに伴い,許容される引数範囲と意味が異なることに注意 (\epTeX~190709以降). 以下,|??|は|wd|, |ht|, |dp|, |ic|のいずれかを表す. \begin{itemize} \item 和文フォントの場合:\.{fontchar??} \\ を$f$,を$c$とおくと, \begin{itemize} \item $c \geq 0$の場合は,$c$を\emph{文字コード}とみなす. $c$が和文文字コードとして有効であれば, 和文フォント$f$における文字コード$c$の和文文字の寸法値を返す. 和文文字コードとして無効であれば0\,ptを返す. \item $c < 0$の場合は,$-(c+1)$を\emph{文字タイプ}とみなす. 和文フォント$f$に文字タイプ$-(c+1)$が定義されていればその寸法値を返し, 未定義であれば0\,ptを返す. \end{itemize} \item 欧文フォントの場合:\.{fontchar??} <8-bit number>\\ オリジナルの\eTeX と同じ挙動である.すなわち, 引数に$c \geq 256$や$c < 0$を与えると \verb+! Bad character code (256).+ のようにエラーが出る. \end{itemize} \csitem[\.{iffontchar} ] \begin{itemize} \item 和文フォントの場合: \.{iffontchar} \\ を$f$,を$c$とおくと, \begin{itemize} \item $c \geq 0$の場合は$c$を\emph{文字コード}とみなし, $c$が和文文字コードとして有効かどうかを判定する \footnote{\pTeX では「任意の和文フォントには,和文文字コードとして有効な 全ての文字が存在する」という扱いであるため,和文フォント$f$によらない.}. \item $c < 0$の場合は$-(c+1)$を\emph{文字タイプ}とみなし, 和文フォント$f$に文字タイプ$-(c+1)$が定義されているかどうかを判定する. \end{itemize} \item 欧文フォントの場合: \.{iffontchar} <8-bit number>\\ オリジナルの\eTeX と同じ挙動である.すなわち, 引数に$c \geq 256$や$c < 0$を与えると \verb+! Bad character code (256).+ のようにエラーが出る. \end{itemize} \end{cslist} \begin{dangerous} 上記で「和文文字コードとして有効かどうか」は,関数|is_char_kanji|を参照. この関数は内部コードによって異なるため,マクロで実装するのは面倒であるが, \epTeX~190709以降では\.{iffontchar}で容易に実現できる. なお,内部Unicodeの\upTeX では任意の非負の値が和文文字コードとして有効なため, |is_char_kanji|は非負かどうかの判定になっている. \end{dangerous} \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{ただし,ソースファイルで言えば \texttt{fam256d.tex}(本文)と\texttt{fam256p.tex}(preamble部)に対応する.}に ちょっとしたサンプルを載せてある. 本節で述べる追加機能はextended modeでなくても有効になっている. ただし,後に説明する「レジスタが各種類65536個まで」は, extended modeの時に限り有効になる. \paragraph{数式フォント制限の緩和} \OMEGA の大きな特徴としては,\TeX 内部のデータ構造を改変し \footnote{詳しくは\texttt{texk/web2c/texmfmem.h}中の共用体% \texttt{memoryword}の定義を参照.大雑把に言うと, 1つの「メモリ要素」に2つの32\,bit整数を同時に格納できるようになっている. なお,少なくともtetex3以降では\texttt{memoryword}は8バイトであるが, \TeX 82では1つの「メモリ要素」を2つの32\,bit整数として使うことはしていない. % [TODO] 正確には "big TeX" からだが, % ・big TeX はいつからあるのか? ・それが標準になったのはいつから? }, \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} \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|は同義である. なお,|\mathcode|~\bits 8としてmath code値を取得できる文字はファミリ番号が16未満のもの (すなわち,\TeX82における|\mathcode|格納値の形式に当てはまるもの)に限られる. delimiter codeについても同様である. さらに,|\odelcode|~\bits 8として51\,bitの形式のdelimiter codeを取得することはできない ($-1$が返る). \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}\index{fi=\texttt{fi}}という, 有限と\texttt{fil}の中間にあたる無限大のレベルが付け加えられた.そこで,この無限大レベル \texttt{fi}も採用することにした. \medskip 実装方法は,大まかには\OMEGA で\texttt{fi}の実装を行っているchange file\ \texttt{omfi.ch}の通りであるのだが,これに\pTeX や\eTeX に伴う少々の修正を行っている. \begin{itemize} \item プリミティブ|\pagefistretch|\indcs{pagefistretch}, |\hfi|\indcs{hfi}, |\vfi|\indcs{vfi}を新たに定義している \footnote{% |\hfi|, |\vfi|については\cite{omegaman}に記述があるが, \TeX~Liveに収録されている$\aleph$(\OMEGA は\TeX~Liveに収録されていない)では 実装されていない.|\pagefistretch|を実装したのは北川の完全な勘違いである. }. \item |\gluestretchorder|\indcs{gluestretchorder}, |\glueshrinkorder|\indcs{glueshrinkorder}の動作を\eTeX のそれと合わせた. 具体的には,あるglue~|\someglue|の伸び量をとおくとき, \[ \hbox{|\gluestretchorder\someglue|}= \begin{cases} 0&\text{が高々\texttt{fi}レベルの量}\\ 1&\text{がちょうど\texttt{fil}レベルの無限量}\\ 2&\text{がちょうど\texttt{fill}レベルの無限量}\\ 3&\text{がちょうど\texttt{filll}レベルの無限量} \end{cases} \] となっている.内部では\texttt{fi}レベルが1,\texttt{fil}レベルが2,……として 処理している\footnote{% \hologo{LuaTeX}にも無限のレベル\texttt{fi}が存在するが, |\gluestretchorder|, |\glueshrinkorder|は\eTeX や\epTeX と異なり, 有限/\texttt{fi}/\texttt{fil}/\texttt{fill}/\texttt{filll}で0/1/2/3/4である. また,r52360で\eTeX 互換を意図した |\eTeXgluestretchorder|, |\eTeXglueshrinkorder|も追加されており, そちらは有限/\texttt{fil}/\texttt{fill}/\texttt{filll}で0/1/2/3とし, \texttt{fi}は$-1$である. }. \end{itemize} \paragraph{レジスタについて} \OMEGA では(前にも書いたが)データ構造の変更が行われ,それによってレジスタが 各種類あたり0番から65535番までの65536個を使えるようになっている. 一方,\eTeX では,256番以降のレジスタを専用のsparse treeに格納することにより, 32767番までのレジスタの使用を可能にしていた.このツリー構造を分析してみる と,65536個までレジスタを拡張するのはさほど難しくないことが分かった. そこで,\epTeX では\eTeX 流の方法を用いながらも, ツリーの階層を1つ増やして,レジスタ(count, dimen, skip, muskip, box, token)を \OMEGA と同じように0番から65535番までの65536個を使えるようにした. 同様に,マーク(mark)のクラス数も32768個から65536個まで増やしている. \section{\hologo{pdfTeX}由来の機能} 開発中の\LaTeX 3では,\eTeX 拡張の他に,\hologo{pdfTeX}で導入された プリミティブ\.{pdfstrcmp}(またはその同等品% \footnote{\hologo{XeTeX}では\.{strcmp}という名称で, \hologo{LuaTeX}ではLuaを用いて実装されている.})% が必要となっており,もはや純粋な\eTeX ですら \LaTeX 3を利用することはできない状況である (\cite{expl31,expl32,expl33}). その他にも,\hologo{pdfTeX}由来のいくつかのプリミティブ(\cite{pdftexman})の実装が 日本の\TeX ユーザ,および\LaTeX3~team% \footnote{% 現在ではさらに状況が動き, 2021年以降は,\LaTeXe 自体が本節で述べたプリミティブを 要求している(\cite{l2e31}). }などからあり, ほとんど\hologo{pdfTeX}における実装をそのまま真似する形で実装している. 現在の\epTeX で利用できる\hologo{pdfTeX}由来のプリミティブの一覧を以下に示す. これらはextended modeでないと利用できない. \begin{cslist} \csitem [\.{pdfstrcmp} ] 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} (dimension)] ページの「幅」「高さ」を表す内部長さであるが, \emph{ここで言う「幅」は「字送り方向」のことではなく,物理的な意味である}. この2つの内部長さを設定するだけではdviに何の影響も与えない. 後で述べる\.{pdflastxpos}, \.{pdflastypos}による出力位置の取得 の際の原点位置を設定するためだけに使われ,初期値は0\,ptである (\hologo{pdfTeX}のdviモードと同じ挙動). ただし,\epTeX では特定書式のpapersize specialを読み取って原点位置を設定する 機能を追加している(第\ref{readpss}節を参照). \csitem[\.{pdflastxpos}, \.{pdflastypos} (read-only integer)]\label{pdfsavepos} \.{pdfsavepos}\indcs{pdfsavepos}が置かれた場所の,dviにおける出力位置を返す内部整数. 原点はページの(物理的な意味の)左下隅であり,$y$軸は(物理的な)上方向に向かって増加する. \begin{itemize} \item ページの物理的な幅と高さはすぐ上の\.{pdfpagewidth}, \.{pdfpageheight}で設定する. これらの内部長さが0\,ptであった場合は,\.{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}の形式で表した文字列に展開される. 末尾に|+09'00'|などと表示されるのはローカルのタイムゾーンであるが, 例えば|SOURCE_DATE_EPOCH=1000000000|のように環境変数を設定すると |D:20010909014640Z|のようにタイムゾーンは|Z|と表示される. % [TODO] |FORCE_SOURCE_DATE|が0か1かは関係する? % https://tug.org/pipermail/tex-live/2018-November/042575.html \epTeX においてプリミティブを実装した当初は「最初にこのプリミティブが実行された時刻を…」と していたが,\epTeX~161030から\hologo{pdfTeX}と同じ挙動に修正した. これは\Pkg{standalone}パッケージを\epTeX で扱うために2013/06/05に実装されたプリミティブであるが, 現在時刻の「秒」まで得るためにも使用できる(\TeX 82では分単位でしか取得できない). \csitem[\.{pdffilemoddate} , \.{pdffilesize} ] それぞれの更新時刻(\.{pdfcreationdate}と同じ形式)と ファイルサイズを表す文字列に展開される. これらも\Pkg{standalone}パッケージのために\epTeX に実装されたプリミティブである. \csitem[\.{pdffiledump} \textrm{[}\texttt{offset} \textrm{]}% \ \texttt{length} ] で与えられたファイル名のバイト目(先頭は0)からバイトを読み込み, 16進表記(大文字)した文字列に展開される. 本プリミティブはHeiko Oberdiek氏による\Pkg{bmpsize}パッケージを\epTeX でも使うために 角藤さんが実装したものである(2014/05/06). \csitem[\.{pdfshellescape} (read-only integer)] \.{write18}によるshell-escapeが利用可能になっているかを示す内部整数. 0ならば不許可,1ならば許可,2ならばrestricted shell-escape% \footnote{あらかじめ「安全」と認められたプログラム(\texttt{texmf.cnf}中で指定する) のみ実行を許可する仕組み.}% である. 本プリミティブは\TeX ユーザの集い2014でリクエストを受けて実装された(\cite{pdfse}). \csitem[\.{pdfmdfivesum} {[\texttt{file}]} ] \texttt{file}が指定された場合は,ファイル名がのファイルのMD5ハッシュ値に展開される. もしファイルが存在しなかった場合は何も返さない. \texttt{file}が指定されなかった場合は,引数のMD5ハッシュ値に展開される. その際,\.{pdfstrcmp}と同じように和文文字はUTF-8で符号化してから計算される. 例えば \begin{verbatim} \pdfmdfivesum{あ} \pdfmdfivesum{^^e3^^81^^82} \end{verbatim} の結果はいずれも\texttt{\pdfmdfivesum{あ}}である. このプリミティブは\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})ことを受けて実装されたものである. % この直後に\Pkg{expl3}パッケージでは使われなくなったが,2021年以降は要求プリミティブとされた. \csitem[\.{pdfuniformdeviate} , \.{pdfnormaldeviate}] \.{pdfuniformdeviate}は,0以上未満の一様分布に従う乱数 \footnote{% 乱数とはいっても,例えば\texttt{\.{pdfuniformdeviate}~536870912}は常に偶数を生成することが知られている (\cite{xe4}).しかしもともとの\hologo{pdfTeX}の実装がそうなっており,他のエンジンでも直されていないため \epTeX でもこの症状には独自対処はしない. }(整数値)を生成し, それを10進表記した文字列に展開される. \.{pdfnormaldeviate}は,平均値0,標準偏差65536の正規分布に従う乱数(整数値)を生成し, それを10進表記した文字列に展開される. \csitem[\.{pdfrandomseed} (read-only integer), \.{pdfsetrandomseed} ] 乱数生成の種の値は,内部整数\.{pdfrandomseed}で取得できる. 種の初期化にはシステムのマイクロ秒単位での現在時刻情報が使われる.また,種の値を 設定するには\.{pdfsetrandomseed}に引数として渡せば良い. \LaTeX3の\Pkg{l3fp}において,2016/11/12あたりから実装された乱数生成機能(\cite{random})を サポートするために\epTeX~161114から実装された. \csitem[\.{pdfelapsedtime} (read-only integer), \.{pdfresettimer}] \.{pdfelapsedtime}は,エンジン起動からの経過時間を``scaled seconds''すなわち $1/65536$秒単位で返す.この値は\.{pdfresettimer}によって再び0にリセットできる. すぐ上の乱数生成プリミティブと同時に実装された. \csitem[\.{expanded} ] (\.{message}が行うのと同様に)を完全展開した結果のトークン列を返す. この命令は元々は\hologo{pdfTeX}に実装計画があったそうである(\cite{expanded})が, しばらくの間\hologo{LuaTeX}にのみ実装されていた命令であった. しかし\cite{expanded1}をきっかけに, \hologo{pdfTeX}, \epTeX, \hologo{XeTeX}で一斉に実装された. \epTeX~180518以降で利用可能である. \csitem[\.{ifincsname}] \texttt{\.{csname}~...~\.{endcsname}}内で評価されたちょうどその時に真となる. \LaTeX~2019-10-01で行われる変更(\cite{latex95,tjb83})で必要になったために \epTeX~190709で導入された. \csitem[\.{vadjust} \texttt{pre} ] \.{vadjust}自体は\TeX82に存在し,それが現れた行の \emph{直後}にを配置するものである. \hologo{pdfTeX}では,\.{vadjust}にキーワード|pre|を付けると,それが現れた行の \emph{直前}にを配置できるように拡張されており, 同じ機能が\hologo{LuaTeX}と\hologo{XeTeX}にも存在するので, \epTeX~210701でこれをサポートした. 発端は,2021年2月にPandocで「ハイパーリンクのターゲットを行の下端ではなく 上端にする」という目的で|\vadjust pre|が使われたことである\cite{tjb115}. \end{cslist} \section{\epTeX の追加プリミティブ} \subsection{バージョン番号} \pTeX~p3.8.0に\.{ptexversion}が実装されたのと同時に,\epTeX でもバージョン番号を 取得する\.{epTeXversion}プリミティブが\epTeX~180121から追加された. \begin{cslist} \csitem[\.{epTeXversion} (read-only integer)] \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} \subsection{\.{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} (read-only integer)] 現在構築中のリストの「最後のノード」が文字由来であれば, そのコード番号(内部コード)を内部整数として返す. リストが空の場合,また 「最後のノード」が文字を表すものでなかった場合は,$-1$が返る. 上記「最後のノード」では,\pTeX によって自動挿入される \begin{itemize} \item メトリック由来の空白(JFMグルー,カーン) \item 行末禁則処理のために挿入されるペナルティ \item 欧文文字のベースライン補正用のノード \end{itemize} は無視される.また,現在の実装では「最後のノード」が欧文文字のリガチャで あった場合は,リガチャそれ自身のコード番号ではなく, 最後の構成要素の文字のコード番号を返すようにしている. \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{dangerous} 「|これは,|」とソース中に入力したときの ノードの状態を\.{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{dangerous} 「最後のノード」を見ているので, \begin{verbatim} これは,\relax\sffamily{}\the\lastnodechar\textmc{『ほげ党宣言』}…… \end{verbatim} のようにノードを作らない\.{relax}, |{}|, \.{sffamily}などが途中にあっても, それらは単純に無視されて \begin{quote} これは,\relax\sffamily{}\the\lastnodechar\textmc{『ほげ党宣言』}…… \end{quote} と「,」の内部コードが取得される. \subsection{\.{lastnodefont}プリミティブ} \.{lastnodechar}を補完するものとして,\epTeX~220214 (\TeX~Live 2022)で実装された. \begin{cslist} \csitem[\.{lastnodefont} (read-only font identifier)] 現在構築中のリストの「最後のノード」が文字由来であれば, そのフォント(内部識別子)を返す. リストが空の場合,また 「最後のノード」が文字を表すものでなかった場合は,|\nullfont|が返る. ここでも「最後のノード」は\.{lastnodechar}と同様で \begin{itemize} \item メトリック由来の空白(JFMグルー,カーン) \item 行末禁則処理のために挿入されるペナルティ \item 欧文文字のベースライン補正用のノード \end{itemize} は無視される. \end{cslist} \TeX~Live 2020の\pTeX~(p3.8.3)で追加された\.{ifjfont}, \.{iftfont}と 組み合わせれば,「最後のノード」が和文文字かどうかを判別できる \footnote{\epTeX では「\.{lastnodechar}が256以上かどうか」でも判別できるが, \eupTeX では文字コード0--255の和文文字ノードも存在しうることに注意.}. \subsection{\.{lastnodesubtype}プリミティブ} \cite{tjb28,plt63}などの議論で,「最後のグルーがJFMグルーの場合のみ \.{unskip}する」処理の必要性が唱えられてきた. \eTeX にはもともと最後のノードの種別を返す\.{lastnodetype}プリミティブが あったが,これでは最後のノードがグルーであるかしかわからない. そのため,\epTeX~180226で\.{lastnodetype}を補完するものとして, \.{lastnodesubtype}プリミティブを追加した. \begin{cslist} \csitem[\.{lastnodesubtype} (read-only integer)] 現在構築中のリストの最後のノードのsubtype値を内部整数として返す. ここでの最後のノードは\.{lastnodetype}と同様である. すなわち,\.{lastnodechar}や\.{lastnodefont}とは \begin{itemize} \item メトリック由来の空白(JFMグルー,カーン) \item 行末禁則処理のために挿入されるペナルティ \end{itemize} も対象とするという点で異なる. \begin{itemize} \item 最後のノードが文字ノードのときは0が返る. \item 現在構築中のリストが空のときは$-1$が返る. \item \epTeX~210701以降では,数式内のノードについてはsubtype値 そのままではほとんど意味がないので,次ページの表の値を返す. \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} \ifnum\jis"2121="3000 %% upTeX check \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} として定義している. \paragraph{\epTeX~210701以降の注意} 上でも述べたように,数式内のノードについてはsubtype値はほとんど意味を持たないので, これらに対する\.{lastnodesubtype}ではsubtype値でなく以下の値を返すようにした: \begin{description} \item[最後のノードが数式内のノード($\.{lastnodetype}=15$)] \begin{multilist}{3}{\hfil\hskip1.5em#:&\quad#\hfil} \item 0&明示的なスタイル指定\footnotemark\cr \item 1&\.{mathchoice}\cr \item 2&\.{mathord}\cr \item 3&\.{mathop}${}+{}$\.{displaylimits}\cr \item 4&\.{mathop}${}+{}$\.{limits}\cr \item 5&\.{mathop}${}+{}$\.{nolimits}\cr \item 6&\.{mathbin}\cr \item 7&\.{mathrel}\cr \item 8&\.{mathopen}\cr \item 9&\.{mathclose}\cr \item 10&\.{mathpunct}\cr \item 11&\.{mathinner}\cr \item 12&\.{radical}\cr %\item 13&分数(\.{over}など)\cr \item 14&\.{underline}\cr \item 15&\.{overline}\cr \item 16&\.{mathaccent}\cr \item 17&\.{vcenter}\cr \item 18&\.{left}\cr \item 19&\.{middle}\cr \end{multilist} \footnotetext{\.{displaystyle}, \.{textstyle}, \.{scriptstyle}, \.{scriptscriptstyle}.} なお,\verb+\left...[\middle]...\right+の直後で\.{lastnodesubtype}を使用しても, \verb+\left...[\middle]...\right+全体が一つの内部数式(\.{mathinner})となるので, \.{right}に「対応する」\.{lastnodesubtype}の値は取得できない. \.{over}プリミティブなどによる分数についても類似の事情がある. \end{description} \subsection{\.{epTeXinputencoding}プリミティブ} 現在読み込んでいるファイルの文字コードを切り替えるプリミティブであり, 2016/02/01に阿部紀行さんによって実装された.詳細は実装者の解説記事 \cite{eptexinputenc}を参照してほしいが,おおまかに述べると以下のようになるだろう. \begin{cslist} \csitem[\.{epTeXinputencoding} ] 現在読み込んでいるファイルの文字コードをに変更する. 実際に変更されるのは「次の行」であり,また現在のファイルからさらに\.{input}等で 読まれたファイルには効力を及ぼさない. 引数の読み取りは, (\LaTeX で定義が上書きされていない,プリミティブの)\.{input}の引数(ファイル名)を 取得するのと同じルーチンが用いられる. そのため, \begin{verbatim} \epTeXinputencoding sjis \end{verbatim} のように,は|{}|で囲まないこと\footnote{\TeX~Live 2020以降, \.{input}プリミティブでブレースで囲まれたファイル名指定が可能に なった(r53729)ことに付随して,\.{epTeXinputencoding}でもブレースで 囲んだの指定が可能となった.}. の末尾は,空白トークンや展開不能トークンによって区切られる. % scan_file_name で を取得しているので, % \epTeXinputencoding "euc" \epTeXinputencoding ""e""u""c"" も OK. の値は,基本的には\pTeX の\texttt{-kanji}オプションで指定できる値 (\texttt{euc}, \texttt{sjis}, \texttt{jis}, \texttt{utf8})である. 大文字小文字は考慮しない(\TeX の\.{uccode}, \.{lccode}は参照しない). % BINARY, ISO-2022-JP, EUC-JP, Shift_JIS, UTF-8 (, uptex) も OK % ptexenc 側で strcasecmp で比較しているので,大文字・小文字の区別はしない % (\uccode, \lccode は参照しない) \end{cslist} \subsection{用紙の原点位置の設定,\.{readpapersizespecial}プリミティブ}\label{readpss} \pTeX 系列では,用紙サイズの指定には伝統的にpapersize specialが利用されてきた. それを考慮して,\epTeX では「特定書式のpapersize specialを読み取って \.{pdflastxpos}, \.{pdflastypos}(第\ref{pdfsavepos}節を参照)の原点位置を設定する」と いう機能を付加している. \begin{dangerous} dviwareによって正確な書式は異なるようだが,\epTeX~180901が解釈するpapersize specialは 以下の文法に沿ったものになっている\footnote{% papersize specialで指定した長さは常に\texttt{true}付きで解釈するのが慣習と なっているが,\epTeX~180901より前では\texttt{true}なしの寸法として解釈するという バグが存在した.}. なお,\Pkg{jsclasses}の|papersize|オプションや2016年以降の \Pkg{graphics}/\Pkg{color}パッケージのドライバオプションが発行する書式は,これに合致する. \def\<#1>{\langle\mbox{#1}\rangle} \begin{align*} \ &\longrightarrow \texttt{papersize=}\\texttt{,}\\\ \ &\longrightarrow \ \\\\ \ &\longrightarrow \texttt{.} \mid \\ \mid \\ \end{align*} 負の符号や小数点としての「\texttt{,}」,そして一切の空白を許容しないところに 注目してほしい.また,\texttt{zw},~\texttt{zh},~\texttt{em},~\texttt{ex}という 現在のフォントに依存する単位も使用不可能である. \end{dangerous} また,\epTeX~180901以降では\.{readpapersizespecial}プリミティブによって 本機能の有効・無効を制御できる. それより前のバージョンでは,本機能は常に有効であった. \begin{cslist} \csitem[\.{readpapersizespecial} (integer)] この内部整数の値が正の場合,\epTeX は papersize specialがdvi中に書き出される時にその内容を解釈し, 自動的に\.{pdfpagewidth}, \.{pdfpageheight}の値を設定する. \epTeX~180901で追加され,既定値は1である. \end{cslist} \subsection{\.{current[x]spacingmode}プリミティブ} もともと\pTeX 系列では,\.{kanjiskip},~\.{xkanjiskip}の挿入が有効になっているか 直接的に知る方法が\.{showmode}プリミティブしかなかった. これでは使い勝手が悪いので, \.{currentspacingmode}, \.{currentxspacingmode}プリミティブが2019/10/28に 山下さんによって実装された(\cite{tjb94}). \begin{cslist} \csitem[\.{currentspacingmode} (read-only integer)] \pTeX の「標準で\.{kanjiskip}を挿入する」機能が有効(\.{autospacing})ならば1, 無効(\.{noautospacing})ならば0を返す. \csitem[\.{currentxspacingmode} (read-only integer)] \pTeX の「標準で\.{xkanjiskip}を挿入する」機能が有効(\.{autoxspacing})ならば1, 無効(\.{noautoxspacing})ならば0を返す. \end{cslist} 同様に,\eupTeX でも\.{currentcjktoken}プリミティブが2019/10/28に実装された. % e-pTeX の追加プリミティブではないが,ドキュメント化の都合上ここに書いた. \begin{cslist} \csitem[\.{currentcjktoken}(read-only integer,\emph{\eupTeX のみ})] \upTeX の「和文(CJK)文字と欧文文字を区別する」機能について, \.{enablecjktoken}の状態ならば0, \.{disablecjktoken}の状態ならば1, \.{forcecjktoken}の状態ならば2を返す. \end{cslist} \section{Unicode \TeX 由来の機能} \subsection{\.{Uchar}, \.{Ucharcat}プリミティブ} \hologo{XeTeX}, \hologo{LuaTeX}には,文字コードを引数にとり \emph{文字トークン}に展開される「\.{Uchar} 」というプリミティブが存在する \footnote{\.{char}は展開不能プリミティブであることに注意.}.また\hologo{XeTeX}には, 文字コード・カテゴリーコードがそれぞれ, である 文字トークンを作る「\.{Ucharcat}~~」というプリミティブも 存在する\footnote{\hologo{LuaTeX}ではLuaによる代替物がある.}. % pTeX の「抜け道」の具体的なコード? \pTeX で「和文版\.{Uchar}」に相当することは\TeX~Live 2019以前の\pTeX ではマクロで実現することが可能だが, 将来の\pTeX の改修で不可能になる恐れ(\cite{tjb81,tjb95})があるので, \epTeX~191112で前段落で述べた\.{Uchar}, \.{Ucharcat}プリミティブを追加することにした. \begin{cslist} \csitem[\.{Uchar} ] 文字コードがの文字トークンに展開される. 指定した値と得られる文字トークンの対応表は次の通り. \begin{center} \small\medskip \begin{tabular}{lccc} \toprule &和文・欧文&\multicolumn{2}{c}{category code}\\\cmidrule(lr){3-4} &&\epTeX&\eupTeX\\ \midrule 0--31, 33--255&欧文文字トークン&12&12\\ 32 &欧文文字トークン&10&10\\ 256以上の&和文文字トークン&---(都度取得)&その時の\.{kcatcode}\footnotemark\\ \bottomrule \end{tabular} \end{center} \footnotetext{もし\.{kcatcode}の値が15だったときは,得られる和文文字トークンの \.{kcatcode}は18となる.} \csitem[\.{Ucharcat} ] 文字コード・カテゴリーコードがそれぞれ, の文字トークンに展開される. \epTeX では和文文字トークンにはカテゴリーコードの情報は保存されないため, \epTeX の\.{Ucharcat}は欧文文字トークンの生成しかサポートしない. 具体的には, 指定可能な値はが0--255,が1--4, 6--8, 10--13のみである. \end{cslist} \begin{dangerous} \eupTeX では,\.{Ucharcat}で和文文字トークンの生成もサポートしている. \medskip \begin{itemize} \item が0--127のときは,欧文文字トークンのみ生成可能である.従って の指定可能値は1--4, 6--8, 10--13. \item が128--255のときは,欧文文字トークン・和文文字トークンの どちらも生成可能である. の指定可能値は1--4, 6--8, 10--13(以上欧文文字トークンを生成), および16--19(和文文字トークンを生成). \item が256以上のときは,和文文字トークンのみ生成可能である.従って の指定可能値は16--19. \end{itemize} \end{dangerous} \begin{dangerous} \.{Uchar}で和文文字トークンを生成するには,その和文文字コードを 与える必要があるが,その値は内部漢字コードに依るので, |\jis|や|\euc|等の文字コード変換プリミティブを使うのが便利である (例えば|\Uchar\jis"3441|で「\Uchar\jis"3441」を得る). ただし,\eupTeX の\.{Ucharcat}ではを 空白トークンで区切る必要があり,注意を要する. 例えば,カテゴリーコード17の「漢」を得ようとして, 単に \begin{quote} \verb+\Ucharcat\jis"3441 17 % エラー+ \end{quote} と書くとエラー\footnote{% \.{jis}の展開時に後ろの空白トークンが食われてしまい,\.{Uchar}には 文字コード2845017($\text{漢}=\text{U+6F22}\rightarrow 28450$と17が 繋がった結果)が渡ってしまう. }が発生する.次のように書けばエラーが回避できるようである. \begin{quote} \verb+\Ucharcat\jis"3441\noexpand\space17 % エラー回避+ \end{quote} あるいは: \begin{quote} \verb+\Ucharcat\numexpr\jis"3441\relax 17 % エラー回避+ \end{quote} \end{dangerous} \subsection{エラー抑制(\.{suppress...error})} \hologo{LuaTeX}に実装されているエラー発生を抑止するプリミティブたちのうち いくつかを,\epTeX~211207で追加した. % 説明文は https://github.com/texjporg/tex-jp-build/pull/127 より \begin{cslist} \csitem[\.{suppresslongerror} (integer)] この内部整数が非ゼロのとき,\.{long}なしで定義されたマクロの引数に\.{par}が入った 場合の \texttt{! Paragraph ended before \.{...} was complete.} というエラーを抑止する. \csitem[\.{suppressoutererror} (integer)] この内部整数が非ゼロのとき,\.{outer}由来のエラーを抑止する. \csitem[\.{suppressmathparerror} (integer)] この内部整数が非ゼロのとき,数式モード中の\.{par}に由来するエラーを抑止する. \end{cslist} \section{\TeX~Liveによる拡張} 2021年以降の\epTeX/\eupTeX には,\TeX~Liveチームによって \hologo{pdfTeX}及び\hologo{XeTeX}と共通の クロスエンジンな拡張機能がいくつか追加されている. % 実は % * tracingstacklevels.ch (add |\tracingstacklevels| since TL2021) % * partokenname.ch (add |\tracingstacklevels| since TL2022) % の change file は e-(u)pTeX のみならず,素の\pTeX にも適用されている. % 残りの % * char-warning-eptex.ch (enhance |\tracinglostchars| since TL2021) % * showstream.ch (add |\showstream| since TL2022) % の change file は e-TeX からの変更であるため,素の\pTeX には適用されない. \subsection{デバッグ機能(\.{tracing...})} \begin{cslist} \csitem[\.{tracinglostchars} (integer)] 現在のフォント(TFM)に存在しない文字にアクセスしたときのトレース情報を どのように表示するかを決定する内部整数である. \TeX82は,値が正(1以上)の場合に \begin{verbatim} Missing character: There is no 文字 in font フォント名! \end{verbatim} のメッセージをログファイルに出力する. また\eTeX は,値が2以上の場合に同じメッセージを\.{tracingonline}の値に かかわらずターミナルにも出力する. \TeX~Live 2021以降ではさらに,値が3以上の場合にエラーを発生させ, 当該文字コードを16進数で表示するように拡張されている.例えば以下のとおり: \begin{verbatim} ! Missing character: There is no 文字 ("XX) in font フォント名. \end{verbatim} なお,\pTeX 系列では「全ての和文フォントには,和文文字コードとして有効な 全ての文字が存在する」という扱いであるため,和文文字コードについて このトレース情報が出力されることはない. \csitem[\.{tracingstacklevels} (integer)] \.{tracingstacklevels}の値が正,かつ\.{tracingmacros}の値も正の場合, マクロ展開の深さを示すprefixを出力する.例えば,深さ2のときは |~..| が表示される. なお,指定された数値以上の深さについてはマクロ展開のトレースを切り捨てる. \TeX~Live 2021で追加された. \end{cslist} \subsection{parトークンの制御} \TeX82では\.{par}という名称の制御綴は特別な役割を持っている. \begin{itemize} \item 以下の場合には自動的に\.{par}が挿入される: \begin{itemize} \item 入力中の空行(2行連続で空行があった場合は2回\.{par}が発行される) \item 水平モード中で\TeX が垂直モード用の命令(\.{vskip}, \.{hrule}, \.{unvbox}, \.{unvcopy}, \.{halign}, \.{end}, \.{dump})に 出くわしたとき,その直前\footnote{オリジナルの状態では\.{par}は 段落終了(垂直モードへ移行)の意味を持つが,\.{par}が再定義されて 垂直モードへの移行に失敗すると無限ループが発生する.} % https://www.ma.ns.tcu.ac.jp/Pages/TeX/vglue.par.html % https://hak7a3.hatenablog.com/entry/2015/03/26/224533 \end{itemize} \item \.{long}なしで定義されたマクロ中の引数には\.{par}は使用できない. \begin{verbatim} ! Paragraph ended before \... was complete. \end{verbatim} というエラーが発生する. なお,禁止されるのは\.{par}という\emph{名称}の制御綴であって, \verb+\let\endgraf\par+などのように別の名称の制御綴に \.{par}の意味をコピーして用いるのは問題ない. \end{itemize} \LaTeXe~2021-06-01などでは「段落終了時のフック」を実現させるために \.{par}の自動挿入という挙動を利用しており,\.{par}を再定義している. しかし,\TeX82には「\.{par}という名称の制御綴」ではなく「暗黙のpar」を挿入する 箇所が存在する.その代表が「\.{vbox}の中身が水平モードで終わった場合」であり, この場合は\.{par}という名称の制御綴を再定義しても使われない. すなわち,\LaTeXe などの「段落終了時のフック」が抜けてしまうことになる. 2021-07-25のコミットr60054(\TeX~Liveでは2022年以降)では, \.{partokenname}と\.{partokencontext}というプリミティブが追加された. \begin{cslist} \csitem[\.{partokenname} ] 上で述べた\.{par}という名称の制御綴の特別な役割を,他の制御綴に移す効果を持つ. \begin{quote} \verb+\partokenname \hoge+ \end{quote} を実行した際に起こる状況で説明すると, \begin{itemize} \item 上記で述べた「自動挿入される命令」が\.{par}から\.{hoge}に変わる. \item \.{long}なしで定義された制御綴の引数において,\.{par}は許容されるようになるが 逆に\.{hoge}が許容されなくなる. \end{itemize} なお,\.{partokenname}の効果は常にグローバルである. \csitem[\.{partokencontext} (integer)] \TeX が\.{par}\footnote{あるいは\.{partokenname}により 代わりに別の制御綴になっているかもしれない.}を 自動挿入する箇所を制御する内部整数であり,既定値は0である. 自動挿入箇所は次の通り: \begin{description} \item[いつでも挿入] \TeX82での自動挿入箇所(上述) \item[$\.{partokencontext}>0$のときのみ挿入] \.{vbox}, \.{vtop}, \.{vcenter}それぞれの末尾 \item[$\.{partokencontext}>1$のときのみ挿入] \.{insert}, \.{vadjust}, \.{valign}での各セル,\.{noalign}のそれぞれの末尾と, output routineの末尾 \end{description} なお,実際の挿入はそれぞれの箇所が水平モードであった場合にのみ行われる. \end{cslist} \.{partokencontext}の既定値は0であり,この場合の挙動は\TeX82と互換である. 値を1にすれば,「\.{vbox}の中身が水平モードで終わった場合」にも 「暗黙のpar」ではなく「\.{par}という名称の制御綴」が挿入されるので, \.{par}の再定義が効く. \subsection{\.{show}系コマンドの出力制御} \begin{cslist} \csitem[\.{showstream} (integer)] 通常,\.{show}系コマンド\footnote{具体的には \TeX82の\.{show}, \.{showbox}, \.{showlists}, \.{showthe}と \eTeX の\.{showgroups}, \.{showifs}, \.{showtokens}が該当. さらに\pTeX 系列では\.{showmode}も加わる.}は エラー発生と同様に一旦停止し,種々の情報をターミナルやログファイルに出力する. しかし,内部整数\.{showstream}の値をオープンな出力ストリーム(\.{openout}で オープンされる)に一致させると,種々の情報の出力先がリダイレクトされ, ターミナルやログファイルには出力せず一旦停止もしない. 既定値は$-1$であり,これはファイルと一致しないため\TeX82と同じ動作となる. 2021-11-07のコミットr60992(\TeX~Liveでは2022年以降)で追加された. \end{cslist} \subsection{展開遅延\.{special}} \begin{cslist} \csitem[\.{special} \texttt{shipout} ] \TeX82の\.{special}プリミティブは,\.{immediate}\.{write}と同様に 引数のトークン列を「即座に」完全展開する. \epTeX~230214(\TeX~Live 2023以降:2023-02-13のコミットr65815を参照) では,新たにキーワード|shipout|を付けるとトークンの展開を 「ページをDVIファイルに出力する時点」まで遅らせる (非\.{immediate}な\.{write}と同様)ことができる.同様の機能が \hologo{pdfTeX}, \hologo{XeTeX}, \hologo{LuaTeX}, Alephで 一斉に実装されている. \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{eptex\_resume.pdf}がそれにあたる. \bibitem{yamamoto} 山本 和義,「数式famの制限とluatex」, 掲示板「\TeX\ Q\ \&\ A」,2009/02/12.\\ \url{https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52744.html} \bibitem{yamamoto2} 山本 和義,「Re: 数式famの制限とluatex」, 掲示板「\TeX\ Q\ \&\ A」,2009/02/16. \url{https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52767.html} \bibitem{yamamoto3} 山本 和義,「数式fam拡張マクロ for e-pTeX等」, 掲示板「\TeX\ Q\ \&\ A」,2009/02/21. \url{https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/52799.html} \bibitem{expl31} 河原,「パッケージとディストリビューションについて」, 掲示板「\TeX\ Q\ \&\ A」,2010/12/16. \url{https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55464.html} \bibitem{expl32} 角藤 亮,「Re: パッケージとディストリビューションについて」, 掲示板「\TeX\ Q\ \&\ A」,2010/12/19. \url{https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55478.html} \bibitem{expl33} zrbabbler,「LaTeX3 と expl3 パッケージ」, ブログ「マクロツイーター」内,2010/12/22. \url{https://zrbabbler.hatenablog.com/entry/20101222/1293050561} % 旧 http://d.hatena.ne.jp/zrbabbler/20101222/1293050561 \bibitem{strcmp} 角藤 亮,「Re: e-pTeX 101231」, 掲示板「\TeX\ Q\ \&\ A」,2011/01/01.\\ \url{https://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/55528.html} \bibitem{pdfse} Dora TeX,「Re: |\pdfshellescape|, |\lastnodechar| の実装」,\TeX~Forum,2014/11/19. \url{https://okumuralab.org/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{https://okumuralab.org/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{xe4} Bruno Le Floch, ``[XeTeX] Random number primitives'', 2016/12/06,\\ \url{http://tug.org/pipermail/pipermail/xetex/2016-December/026920.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} \bibitem{latex95} Volker-Weissmann, ``Feature Request: Better error messages for non-ASCII symbols in labels.'', 2018/12/03.\\ \url{https://github.com/latex3/latex2e/issues/95} \bibitem{tjb81} 北川 弘典,「バイト列と和文文字トークンの区別」,2019/06/08.\\ \url{https://github.com/texjporg/tex-jp-build/issues/81}. \bibitem{tjb83} aminophen,「[e-pTeX] \.{ifincsname}」,2019/07/09.\\ \url{https://github.com/texjporg/tex-jp-build/issues/83}. \bibitem{tjb94} aminophen,「e(u)ptex: add |\current(x)spacingmode|, |\currentcjktoken|」,% 2019/10/28.\\ \url{https://github.com/texjporg/tex-jp-build/pull/94}. \bibitem{tjb95} 北川 弘典,「[eptex] |\Uchar| and |\Ucharcat|」,2019/10/30.\\ \url{https://github.com/texjporg/tex-jp-build/issues/95}. \bibitem{l2e31} The \LaTeX3 Project Team, \textit{\LaTeX\ News Issue 31}, 2020.\\ |$TEXMFDIST/source/latex/base/ltnews31.tex|, \\ \url{https://www.latex-project.org/news/latex2e-news/ltnews31.pdf}. \bibitem{tjb115} aminophen,「e(u)ptex: Add |\vadjust pre|」,2021/05/22.\\ \url{https://github.com/texjporg/tex-jp-build/pull/115} \end{thebibliography} \newpage \printindex \newpage\scrollmode \input fam256d.tex \newpage \end{document}