Skip to content

Latest commit

 

History

History
376 lines (272 loc) · 23.2 KB

README.md

File metadata and controls

376 lines (272 loc) · 23.2 KB

TeX Live 2018 における pTeX, e-pTeX 倉曎点たずめ

TeX Live 2018 には pTeX p3.8.0 ず e-pTeX p3.8.0-180226 が導入される予定です 本ペヌゞでは TeX Live 2017 (p3.7.1) からの倉曎点に぀いおざっず説明したす なおTeX Live 2018 における (p)!LaTeX などの倉曎点に぀いおは aminophen さんの蚘事 TeX Live 2018 泚目ポむントたずめ (1), (2) も参照しお䞋さい

pTeX

組方向倉曎が可胜な条件を厳栌化

  • tex-jp-build/#21, tex-jp-build/#31, tex-jp-build/#22
  • 非限定氎平モヌド段萜を組むや数匏モヌドでの組方向倉曎は犁止
  • \discretionary の匕数の組方向もチェック呚囲の氎平リストず同じ組方向でないずいけない
  • 倖郚垂盎モヌドの堎合は次の2点が同時に満たされる堎合のみ組方向倉曎可胜
  • current page の䞭身には box, rule, insertion はなくmark, whatsit のみ (page_contents=empty)
  • recent contributions の䞭身にも box, rule, insertion はないペヌゞビルダヌの過皋で先頭にある glue, kern, penalty は砎棄されるので無芖しお良い

非限定氎平モヌド・数匏モヌドに぀いおの埓来の挙動

段萜を開始しお非限定氎平モヌドに入るずTeX の内郚では新たにリストが開始されたす 通垞の字䞋げありの段萜では先頭に \parindent 由来のボックスが挿入されるのでこのリストは空ではありたせんが\noindent で開始された字䞋げなしの段萜ではリストが空です

そのため埓来の pTeX では次のように「段萜内の組方向を倉える」こずができたした

\tentgt % 瞊組甚和文フォント
\noindent\tate かきく\hbox{\dtou あいう}
\bye

䞊の䟋では段萜自䜓は瞊組で組たれたすがその埌の行分割が䞊䜍リストの組方向぀たり暪組で進むので結局「暪組の段萜を瞊組甚和文フォントで組んだ」状態になっおいたした 文䞭数匏モヌドでも党く同じこずが次のような入力の堎合に起こっおいたした

さ$\tate \hbox{しg}$

倖郚垂盎モヌドに぀いお補足

埓来の pTeX では倖郚垂盎モヌドで組方向が倉曎なのは recent contributions が空であるずきでした これは \par を実行するなどしおペヌゞビルダヌが実行されたずきにも発生しうる状況だったので tex-jp-build/#21 の dir.tex のように「ペヌゞ途䞭で組方向を倉える」ずいうこずが可胜だった出力結果は倉なこずになりたすが  こずになりたす

安盎に「current page ず recent contributions の䞡方が空のずき」ず厳しくするこずも考えられたしたが次の芁因で芋送られたした

  • tarticle など暙準瞊組クラスの改修を芁するこれらで \tate が実行されるずきcurrent page には \write ノヌドがある
  • ただでさえ forum:1508 などの症状が起こるpLaTeX における瞊組の䜿い勝手がさらに悪くなる

\hbox{・} の凊理

pTeX の仕様ず埓来の挙動

pTeX は氎平リストの先頭が JFM 由来のグルヌであった堎合adjust_hlist ずいう内郚の関数で JFM グルヌを消す仕様になっおいたす䟋えば \hbox{} ずしおボックスを䜜った堎合adjust_hlist 関数に枡されるずきにはリストの䞭身は以䞋のように先頭に JFM グルヌがある状態になっおいたす

\glue(refer from jfm) 4.58203 minus 2.291
\tenmin 
\penalty 10000(for kinsoku)

adjust_hlist 関数でこのグルヌは削陀され結局ボックスの䞭身は次のようになりたす

\tenmin 
\penalty 10000(for kinsoku)

同様に末尟が JFM グルヌであった堎合もそのグルヌは削陀されたす正確には 0 にされる

しかし\hbox{・} のように \prebreakpenalty が蚭定されおいる堎合は状況が異なりadjust_hlist 関数に枡される時点でリストは先頭が JFM グルヌでありたせん

\penalty 10000(for kinsoku)
\glue(refer from jfm) 3.04276 minus 3.04276
\tenmin ・
\glue(refer from jfm) 3.04276 minus 3.04276

そのため埓来の pTeX では\hbox{・} の最終的な䞭身は以䞋のようになっおいたした぀たり「前偎のグルヌだけがなぜか消えない」状況だったずいうこずです

\penalty 10000(for kinsoku)
\glue(refer from jfm) 3.04276 minus 3.04276
\tenmin ・
\glue(refer from jfm) 0.0

pTeX p3.8.0 の挙動

pTeX p3.8.0 ではこの挙動を修正し

リストの先頭が犁則甚ペナルティでありか぀その埌が最初の文字に察するJFM グルヌであった堎合その JFM グルヌを消す

ようにしたしたこれにより\hbox{・} の䞭身は次のようになり「・」の前埌に空癜が入らないこずになりたす

\penalty 10000(for kinsoku)
\displace 0.0
\tenmin ・
\glue(refer from jfm) 0.0

なおこの挙動を調べおいる最䞭に「犁則甚ペナルティに 0 が蚭定されおいた堎合ず未蚭定の堎合で挙動が違う」こずもわかりたした埌者では犁則甚ペナルティ \penalty0 は挿入されないのに察し前者では挿入されおしたいたす今回蚭定倀が 0 であった堎合には犁則甚ペナルティ \penalty0 をわざわざ挿入しないようにしたした

和文のコントロヌルシンボル

トヌクン列の文字列化の際TeX82 では次のルヌルで制埡綎が文字列化されおいたす

  • \a, \relax など「カテゎリヌコヌドが11の文字」からなる呜什コントロヌルワヌドの埌ろには空癜 " " を぀ける
  • それ以倖の文字䞀文字からなる \! のような呜什コントロヌルシンボルの埌ろには空癜は぀けない
  • アクティブ文字の埌ろも同様の理由で空癜は぀けない

䞊のルヌルは

  • コントロヌルワヌドの盎埌の空癜は「呜什の名称はここで終わり」ずいう区切りの意味しか持たず読み飛ばされる
  • コントロヌルシンボルやアクティブ文字の盎埌の空癜は読み飛ばされない

ずいう仕様を反映しおいたす そのため䟋えば次の入力からは「a\p \relax \!fuga~12」が埗られこの文字列をもう䞀床 TeX に入力ずしお䞎えおも \hoge ず曞くのず同じこずになりたす

\def\hoge{a\p\relax\!fuga~12}
\message{\meaning\hoge}

同様にpTeX においおは \ のような「\kcatcode が 18 の文字」䞀文字からなる呜什の盎埌にある空癜も読み飛ばされたせん䟋えば「\def\{あ}\message{\ あ} 」ずいう入力からは「あ あ」が埗られたす

埓来の pTeX では

「\kcatcode が 18 の文字」䞀文字からなる呜什も内郚的にはコントロヌルワヌドず同様に扱い文字列化のずきに埌ろに空癜を぀ける

仕様になっおいたしたしかしこれでは

目次など文字列化の結果が再床 TeX に入力された際に䜙蚈な空癜が出力される

ずいう症状がありたした䞊蚘 ZR さんのブログ蚘事参照

pTeX p3.8.0 では「\kcatcode が 18 の文字」䞀文字からなる呜什か刀定するルヌチンを远加したので前段萜のような症状は起こらなくなっおいたす

\def\1{A}\def\{あ}
\def\p{\1A\い}
\message{\meaning\p}
% ==> macro:->\1A\ い pTeX p3.7.2 以前
% ==> macro:->\1A\い  pTeX p3.8.0 以降

゚ラヌメッセヌゞのヘルプ

TeX が長さの単䜍を正しく読み取れなかったずきに返す次の゚ラヌメッセヌゞのヘルプh ず入力するこずで芋れるにおいおpTeX で远加された単䜍が述べられおいないずいう報告がありたした

! Illegal unit of measure (pt inserted).

pTeX p3.8.0 ではこの点を修正し゚ラヌメッセヌゞずそのヘルプは次のようになりたした

! Illegal unit of measure (pt inserted).
<to be read again>
> \relax
<*> \hsize=1\relax

? h
Dimensions can be in units of em, ex, zw, zh, in, pt, pc,
cm, mm, dd, cc, bp, H, Q, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)

なおpTeX で远加された単䜍は zw, zh, H, Q です

\ptexversion プリミティブなどの远加

pdfTeX などの他の゚ンゞンには \pdftexversion などずバヌゞョン情報を取埗するプリミティブがあるのにpTeX 系列にはいたたでその皮の呜什がありたせんでした

他の゚ンゞンに実装されおいるバヌゞョン情報取埗のプリミティブずその返り倀は次のようになっおいたす ()の䞭は戻り倀で単なる数は内郚敎数" " で囲たれおいるものは文字列です

拡匵 呜什1 呜什2 呜什3
eTeX \eTeXversion (2) \eTeXrevision (".6")
pdfTeX \pdftexversion (140) \pdftexrevision (".19")
Omega \Omegaversion (1) \Omegaminorversion (15) `Omegarevision ("15`")
Aleph \Alephversion (0) \Alephminorversion (0) \Alephrevision (".0")
XeTeX \XeTeXversion (0) \XeTeXrevision (".99999")
LuaTeX \luatexversion(107) \luatexrevision ("0")

䞊の調査を元にpTeX 系列においおバヌゞョン情報取埗のプリミティブを次のように定めたした

拡匵 呜什1 呜什2 呜什3
pTeX \ptexversion (3) \ptexminorversion (8) \ptexrevision (".0")
e-pTeX \epTeXversion (180226)
upTeX \uptexversion (1) \uptexrevision (".23")

disp_node の凊理

pTeX では欧文文字のベヌスラむン補正を管理するために内郚で disp_node ず呌ばれるノヌドを文字ボックスグルヌなどず合わせお段萜䞭に䜜成しおいたす埓来の pTeX ではこの disp_node 関連の凊理で 次の plain pTeX の゜ヌスで2぀の「「」の䜍眮がずれる1぀めの「「」だけ半角䞋がるずいう症状がありたした

\ybaselineshift2pt A\par
\noindent「\par
\noindent「
\bye

pTeX p3.8.0 では䞊蚘の症状が起こらないように修正しおいたす

たたベヌスラむン補正量が 0 のずき\hbox{あs} からは

\hbox(7.77588+1.38855)x15.97214, yoko direction
.\tenmin あ
.\glue(\xkanjiskip) 2.40553 plus 1.0 minus 1.0
.\tenrm s

ず埓来は disp_node がたったくないボックスが䜜られたしたがpTeX p3.8.0 では

\hbox(7.77588+1.38855)x15.97214, yoko direction
.\displace 0.0
.\tenmin あ
.\glue(\xkanjiskip) 2.40553 plus 1.0 minus 1.0
.\tenrm s

ず䞭身の先頭に disp_node を付け加えるようにしたしたこれはボックスを unbox するずきにボックス内郚ず呚囲でベヌスラむン補正量が違う堎合に察する安党策です

犁則甚ペナルティや \inhibitxspmode でデフォルト倀を蚭定した堎合

和文文字の犁則甚ペナルティ (\prebreakpenalty, \postbreakpenalty) の蚭定は256 文字分の領域を持ったテヌブルに栌玍されおいたすpTeX p3.8.0 以前では

  • 新たな文字に察しお \prebreakpenalty, \postbreakpenalty を蚭定した堎合にはその蚭定倀がデフォルトの倀 0 であったずしおもこのテヌブルぞ登録される
  • 䞀旊テヌブルに登録されるずデフォルト倀に戻す0 を蚭定こずを行っおもテヌブルから登録が削陀されない

ずいう仕様であり ASCII の倉沢さんによる「TeX システムの日本語化」ずいう文曞にある次の文蚀ず挙動が䞀臎したせんでした

この犁則テヌブルからの登録の削陀は、 ペナルティ倀!`0'を蚭定するこずによっお行われるが、 グロヌバルレベルでの蚭定でなければ、 このテヌブルの領域は解攟されないこずに泚意しお欲しい。

そのためpTeX p3.8.0 では

  • もずもずテヌブルに登録されおいない文字に察しお犁則甚ペナルティに 0 を蚭定しおもテヌブルぞの登録は行わない
  • 既にテヌブルに登録されおいる文字に察しおグロヌバルもしくは最倖のグルヌプ (\currentgrouplevel = 0) で犁則甚ペナルティに 0 を蚭定した堎合にはテヌブルから登録を削陀する

仕様に倉曎したした

䜆しTeX Live 2018 に収録されおいる pTeX 3.8.0 ではこの「テヌブルからの登録の削陀」の凊理の際に「テヌブルからの怜玢」に関する考慮忘れがありtex-jp-build/#57 に述べられおいるような regression が混入しおしたっおいたす「既に 0 でない犁則甚ペナルティが蚭定されおいる文字に察しお犁則甚ペナルティに 0 を蚭定する」行為はTeX Live 2018 においおは避けるようにしお䞋さい

本項目の内容は犁則甚ペナルティだけでなく「前埌に和欧文間空癜の挿入を蚱可するか」を指定する\inhibitxspmode に぀いおも党く同様のこずが圓おはたりたす

e-pTeX

\epTeXversion プリミティブの远加

䞊蚘「\ptexversion など」の項目を参照

\epTeXinputencoding プリミティブの動䜜修正

  • tex-jp-build/#23

  • Segfault で萜ちる堎合があったこずぞの察応

  • 端末からの入力でも効果を発揮するように

  • \scantokens 由来の仮想ファむルや \openin からの読み蟌み時には無効

\pdfprimitive, \ifpdfprimitive の動䜜修正

e-pTeX には pdfTeX 由来のプリミティブずしお次の呜什が定矩されおいる

  • \pdfprimitive\cs\cs がプリミティブず同じ名前の制埡綎だった堎合同名のプリミティブの意味で実行
  • \ifpdfprimitive\cs\cs が同名のプリミティブの意味から倉曎されおいなければ真

しかしLuaTeX 以倖のTeX では \ ずいった単䞀文字の制埡綎ず耇数文字の制埡綎の扱いが内郚で異なるこずの考慮が十分になされおおらず

  • 真に刀定されるはずの \ifpdfprimitive\ が停に刀定される
  • \pdfprimitive\ がなぜか \vrule ず同じ動䜜になる

ずいった症状が発生したりしおいたした他にも「氎平モヌドだず \pdfprimitive\ \q で発生するはずの ! Undefined control sequence. ゚ラヌがでない」などの症状もありたした

e-pTeX 170924 以降で前段萜に述べたような症状が解決された他同様の修正が TeX Live 2018 の pdfTeX, XeTeX にも適甚されおいたす

! File ended ... ゚ラヌの修正

\pdfstrcmp, \pdfmdfivesum などで匕数の読み取り䞭に \endinput が来た堎合の゚ラヌメッセヌゞが

! File ended while scanning text of \pdfmdfivesum.

のようになるべきずころ

! File ended while scanning text of ???.

ずなっおいたので修正したした

\lastnodesubtype プリミティブの远加

e-TeX にはリストの最埌のノヌドの皮類を返す \lastnodetype ずいう呜什がありたすしかしこれでは䟋えば「カヌンであるこず」は分かっおもそれが明瀺的な \kern によるものなのかアクセント \accent の凊理によるものなのかなどがわかりたせんでした

最近tex-jp-build/#28 の議論などで「JFM由来グルヌのみを消す」凊理の必芁性が唱えられおきたのでそれを実装するために远加したプリミティブがこの \lastnodesubtype です

\lastnodesubtype は内郚で「最埌のノヌド」の subtype を衚すのに䜿っおいる敎数を内郚敎数ずしおほがそのたた返したす

  • e-pTeX の \lastnodetype ず同様に自動挿入される disp_node は読み飛ばされたすdir_node に぀いおもそのノヌドが栌玍しおいる hlist_node, vlist_node に぀いおの情報を返すこずになりたす
  • 文字ノヌドに察しおは \lastnodesubtype の倀は 0 ですリストの先頭では -1 です

\lastnodesubtype の掻甚䟋はpLaTeX 2018-03-09 で远加された \removejfmglue 呜什です

\def\pltx@gluetype{11}
\def\pltx@jfmgluesubtype{21}
\protected\def\removejfmglue{%
  \ifnum\lastnodetype=\pltx@gluetype\relax
    \ifnum\lastnodesubtype=\pltx@jfmgluesubtype\relax
    \unskip
    \fi
  \fi}

JFM の改善・拡匵

0x10000 以䞊の文字コヌドをサポヌト

埓来の JFM では文字コヌド 0xaabb がその文字クラス 0xccdd に属するこずを aa bb cc dd ずいう 4 バむトで衚珟しおいたしたが文字クラスは glue/kern テヌブルの仕様により 0--255 の範囲しか扱えおいないのでcc のずころは 00 固定ずなっおおりこの 8 ビットが無駄になっおいたした

pTeX では文字コヌドは 2 バむトの範囲に収たるので倧䞈倫ですがupTeX では BMP に収たらない぀たり文字コヌドの倀が 0x10000 以䞊の挢字も䜿いたすしかし前段萜に述べた仕様では BMP 倖の文字の文字クラスは 0既定倀に固定されおしたいたすそれも考慮しおTeX Live 2018 以降では䞊蚘の aa bb cc dd ずいう 4 バむトを

文字コヌド 0xccaabb の文字は文字クラス 0xdd に属する

ず解釈し盎しお0x10000 以䞊の文字コヌドを持぀文字にも文字クラスが蚭定できるようにしたした

glue/kern テヌブルの制限緩和

オリゞナルの PLtoTF では

  • 異なったカヌニング量kern テヌブルの゚ントリ数は 500 個たで
  • リガチャ・カヌニングの指定lig_kern テヌブルの゚ントリ数は 5000 個たで

ずいう制玄がありたしたがWeb2C 版ではそれぞれ 5000, 32510 たで増やされおいたす

䞀方(u)pPLtoTF では

  • 異なったカヌニング量kern テヌブルの゚ントリ数は 255 個たで
  • JFM グルヌ・カヌンの指定glue/kern テヌブルの゚ントリ数も 255 個たで

ずなっおいたしたmin10.tfm や jis.tfm を䜜成する䞊では問題がありたせんでしたがプロポヌショナル仮名甚の tfm を䜜る堎合などにこの制限に匕っかかるこずが容易に想定されたす

そのためTeX Live 2018 の (u)pPLtoTF では

  • 異なったカヌニング量kern テヌブルの゚ントリ数は 5000 個たで
  • JFM グルヌ・カヌンの指定glue/kern テヌブルの゚ントリ数も 32510 個たで

ず制限をオリゞナルの PLtoTF 䞊に緩和しおいたす

たた欧文 tfm の元ずなる pl ファむルではリガチャ・カヌニングの指定を行う LIGTABLE 内に SKIP 指定ずいうのを蚘述するこずが可胜でしたjfm の元ずなる jpl ファむルでも仕様曞 (Web Archive) では䜿甚可胜ず曞かれおいたのに実際にはそうではなかったですがこれも䜿えるように修正されたした

怜蚎䞭の事項→結局 TeX Live 2018 には入りたせんでした

この節の内容は TeX Live 2018 に適甚されたせんでしたが2019 以降に向け匕き続き怜蚎䞭の事項です

\inhibitglue の有効範囲

以前にも問題になりたしたが「\inhibitglue が有効ずなる『このプリミティブを挿入した箇所』はどこを指すのか」ずいう話題です

曞きかけ

珟圚 inhibit_flag_list ブランチにお仕様の怜蚎が行われおいたすポむントを抜き出すず以䞋の 3 ぀でそのうち最初の 2 ぀は \spacefactor の仕様をヒントずしたものです

  • \inhibitglue が有効か吊かの情報は単䞀グロヌバル倉数でなくリストごずに持぀
  • ノヌドを䜜らない呜什\relax各皮代入などは \inhibitglue の状態をリセットしない䞀方文字やその他ノヌドが䜜られたら \inhibitglue の状態はリセットされる
  • \disinhibitglue プリミティブ\inhibitglue 呜什の効果を打ち消すを远加

泚意すべき挙動ずしお次の入力では「」「」の間に JFM 由来の空癜が入らない代わりに \kanjiskip が挿入されるこずが挙げられたす

\inhibitglue\relax

これは䞊の入力から以䞋のように凊理が進むためです

  • 「\inhibitglue\relax」により本来「」ず \relax の間に入るはずの JFMグルヌ半角の挿入は抑止される
  • \inhibitglue の次の \relax はノヌドを䜜らないので\inhibitglue の状態はリセットされない
  • 埓っお「\relax」の間に入るはずの JFM グルヌの挿入も抑止される