
私の目標は、文字バイトそして文字トークン改行バイトに関して。おそらく私は事実を正確に把握していないのでしょう。
TeXがバイトファイルを読むときは、エンコードを考慮する必要があります。それはさておき、
我々は、単一の改行文字バイト(LF と CRLF を想定) はスペースに変換されます。しかし、舞台裏では何が起こっているのでしょうか? データ ペア (LF バイト数、catcode=10) を使用してトークンが作成されるのでしょうか?
連続する2つの改行文字バイトデータ ペア (スペース バイト番号、catcode 5) を含む 1 つのトークンになりますか?
catcode 5「行末」はいつ有効になりますか?
\par
LaTeX では、連続する 2 つの行末に遭遇すると が挿入されることは知っています。
コード
\tmp
catcode 5 のトークンを視覚的に表示しようとしましたが、本当に catcode 5 になるかどうかはまだわかりません。
\documentclass{article}
\usepackage{fontspec}% xelatex
\long\def\scan#1{#1\par\rule{\textwidth}{2pt}\par\xscan#1\relax}
\long\def\xscan{\afterassignment\xxscan\let\tmp= }
\long\def\xxscan{%
\ifx\tmp\relax\else%
\ifcat\tmp\space10 \else%
\ifcat\tmp a11 \else%
\ifcat\tmp 112 \else%...
\ifcat\tmp
5
\else%
\fi\fi\fi\fi
\expandafter\xscan
\fi}
\begin{document}
\scan{ mac::exception ==
a
}
\end{document}
ノート
- xelatex は UTF-8 に対応しているため、2 バイトの行末を読み取る方法を知っている必要があります。
- 変更されたコード:LaTeX でマクロ (catcode 10) 内のスペースを認識させるにはどうすればよいですか?
答え1
catcode 5 のトークンは存在しません。
イニテックスが設立
\catcode`\^^M=5
しかし、それは
\catcode`\%=14
これは%
catcode 14 になりますが、その catcode を持つトークンはありません。catcode 14 の文字がスキャンされると、その文字と行の残りの部分は破棄されます。
catcode 5の文字はスペース文字を生成し、texのスキャナを特別なモードに設定して、catcode 10の直後の文字を破棄します(「行頭の空白」)。また、catcode 5の次の文字は\par
スペーストークンではないものとしてトークン化されます(「空白行は\par
「
したがって、最初の改行は常にスペースを作成し、後続の改行もスペースを作成する\par
ので、空白行は通常 と同等であることに注意してくださいspace\par
。
答え2
文字にはカテゴリーコードがあり、できるトークン化フェーズで文字トークンを生成しますが、必要はありませんに。
カテゴリ コードは 2 つの目的で使用されます。トークン化中 (TeX が入力ファイルまたは端末からテキストを吸収するとき) だけでなく、トークン リストの処理中にも参照されます。
カテゴリコードを持つ文字のみ
1 2 3 4 6 7 8 10 11 12 13
それぞれ同じカテゴリコードを持つ文字トークンを生成できる
開始グループ
終了グループ
数式シフト
配置
パラメータ
上付き文字 下
付き文字
スペース
文字
その他の文字
アクティブ文字
カテゴリコード0 5 9 14 15の文字は一度もない同じカテゴリ コードを持つ文字トークンを生成します。これらのカテゴリ コードを持つ文字トークンが TeX 内部トークン プロセッサを通過する方法はありません。
カテゴリコード0の文字は制御シーケンスの形成をトリガーします
カテゴリコード9の文字は無視されます
カテゴリコード15の文字はエラーを発生させ、無視されます。
カテゴリコード14の文字は、トークン化プロセッサに、その行の他のすべての文字とともに無視するように指示します。
さらに興味深いのは、あなたの質問の対象であるカテゴリコード5です。TeXがカテゴリコード5を見つけると、入力行に残っているものはすべて破棄され、スペース文字文字コード 32 とカテゴリ コード 10 を持つ文字を、その行に最初から存在していたかのように処理し、何か別のものに到達するまで、空白スペース (カテゴリ コード 10) を無視する特別な状態にスキャナーを設定します。これがカテゴリ コード 5 の別の文字である場合、TeX はトークンを生成し\par
、それ以外の場合は通常の状態になります。
強調されている点に注目してくださいスペース文字上記: このスペース文字は通常の規則に従ってトークン化されるため、制御ワード ( など\foo
) の後に続く場合は無視されますが、制御記号 ( など\~
) の後には無視されません。
その結果、次の入力
\foo\baz
\foo \baz
\foo \baz
完全に同等です。最後の入力の行末がスペーストークン違いはあるだろう。しかし、確かにスペース文字代わりに (まだトークン化されていない) が生成されます。
注記。無視される文字に関する上記の説明は、制御ワードの形成に直面したときに誤解を招く可能性があります。制御ワードの形成は、カテゴリ コード 0 の文字から始まり、カテゴリ コード 11 のいずれかの文字が続きます。カテゴリ コードが 11 以外の文字があると、スキャンが停止し、形成された制御ワードのトークン化が発生し、新たに検査されます (たとえば、カテゴリ コード 9 の場合は無視されるかどうか)。
XeTeX と LuaTeX に関する補足。UTF-8 でエンコードされたファイルが Unicode 対応エンジンに送られると、UTF-8 表現で文字の長さが 1 バイト、2 バイト、3 バイト、または 4 バイトであるかどうかは重要ではありません。これら 2 つのエンジンは、UTF-8 の組み合わせを Unicode エンティティに変換する予備ステップを実行するため、トークン化プロセッサが認識するのは 1 つの文字 (初期化テーブルで割り当てられたカテゴリ コードを持つ) だけです。2 つのエンジンは、UTF-16 または UTF-32、リトル エンディアンまたはビッグ エンディアンにも対応できます。
答え3
TeX は入力を行ごとに読み取ります。つまり、入力の 1 行が読み取られて処理されます。次に、入力の別の行が読み取られて処理されます。...
TeX が入力行を読み取った後に最初に行うことの 1 つは、文字をコンピュータ プラットフォームの文字エンコード スキームから TeX エンジンの内部文字エンコード スキームに変換することです。従来の TeX エンジンでは、内部文字エンコード スキームは ASCII (American Standard Code for Information Interchange) です。LuaTeX または XeTeX に基づく TeX エンジンでは、内部文字エンコード スキームは Unicode であり、ASCII は厳密なサブセットです。
その後、TeX は行の右端にあるスペース文字を削除します。より正確には、その後、TeX は行の右端にある文字コードが 32 である文字を削除します。(32 は、ASCII と Unicode の両方におけるスペース文字のコード ポイント番号です。)
次に、TeXは行の右端に、文字コードが整数パラメータの値に等しい文字を挿入します。\endlinechar
通常、
の値は\endlinechar
13 で、文字 13 (改行文字) のカテゴリ コードは 5 (行末) です。
これは通常、TeX が行末に達する行をトークン化しているときに、カテゴリ コードが 5 (行末) の文字に遭遇することを意味します。
次に、TeX は行のトークン化を開始します。つまり、TeX は行に含まれる文字を「調べ」、カテゴリ コード テーブルと読み取り装置の状態に応じて、制御シーケンス トークンと文字トークンを生成します。
入力を読み取ってトークン化する時点で、TeX の読み取り装置は次の 3 つの状態のいずれかになります。
状態S:空白をスキップします。読み取り装置は状態Sになります。
- 入力からカテゴリコードが 10 (スペース) の文字を処理した後。
- カテゴリ コード 7(上付き文字) の等しい 2 つの文字のシーケンスを処理した後、カテゴリ コードが 10(スペース) である文字の小文字の 16 進表記の文字コードを形成する 2 つの文字のシーケンスを処理します。
[例: 通常、のカテゴリ コードは^
7(上付き文字) ですが、文字 32(スペース文字、16 進数 20) のカテゴリ コードは通常 10(スペース) です。したがって、表記は^^20
通常、カテゴリ コードが通常 10(スペース) である入力から文字 32(スペース文字) を処理するように扱われます。] - カテゴリコード 7(上付き文字)の等しい文字 2 文字のシーケンスを処理した後、文字の文字コードが 64 から 127 の範囲にある場合、文字コードから 64 を引いた文字のカテゴリコードが 10(スペース) である文字を処理します。
[例: のカテゴリコードは^
通常 7(上付き文字)で、の文字コードは`
96 ですが、96-64=32 であり、文字 32(スペース文字)のカテゴリコードは通常 10(スペース) であるため、この表記は通常、^^`
カテゴリコードが通常 10(スペース) である入力から文字 32(スペース文字)を処理するように扱われます。] - カテゴリコード 7 (上付き文字) の等しい 2 つの文字のシーケンスを処理した後、文字の文字コードが 0 から 63 の範囲にある場合、文字コードに 64 を加算して得られる文字のカテゴリコードは 10 (スペース) である文字が続きます。
- 制御ワードトークンを生成した後。
- カテゴリコード 10 (スペース) の文字によって名前が形成される制御記号トークンを生成した後。例: 制御記号トークン
\␣
(制御スペース) を生成した後。
状態 S では、カテゴリ コードが 10 (スペース) である文字の処理と、カテゴリ コード 10 (スペース) の文字と同等であると見なされる^^..
-sequence/ <superscript-char><superscript-char>..
-sequence の処理の両方で、トークンは生成されず、読み取り装置の状態は変更されません。
通常、カテゴリ コードが 10 (スペース) である文字は、スペース文字 (文字コード 32) と水平タブ文字 (文字コード 9) のみです。
そのため、入力に連続する複数のスペース文字または水平タブ文字があっても、通常は 1 つのスペース トークンしか生成されず、スペース トークンが水平接着を生成するモードの 1 つ (つまり、水平モード、制限された水平モード、ただし垂直モード、内部垂直モード、数式モード、表示数式モードのいずれでもない) の TeX の場合、1 つの水平スペースに対してのみ水平接着が生成されます。
状態M:行の中央。読み取り装置は状態Mになります。
- スペース以外の文字トークンを生成した後。
- カテゴリコード 10 (スペース) 以外の文字によって名前が形成された制御記号トークンを生成した後。
状態 M では、カテゴリ コードが 10 (スペース) である文字の処理と、カテゴリ コード 10 (スペース) の文字と同等であると見なされる^^..
-sequence/ <superscript-char><superscript-char>..
-sequence の処理の両方で、スペース トークン、つまり、文字コードが 32 (スペース文字) でカテゴリ コードが 10 (スペース) である文字トークンが生成され、読み取り装置の状態が状態 S に切り替わります。
状態N:新しい行。読み取り装置は、入力の次の行の読み取りを開始しようとしているとき、状態 N にあります。状態 N にある間、カテゴリ コードが 10 (スペース) である文字の処理と、カテゴリ コード 10 (スペース) の文字と同等であると見なされる^^..
-sequence/ <superscript-char><superscript-char>..
-sequence の処理の両方で、トークンは生成されず、読み取り装置の状態は変更されません。
読み取り装置が状態 S にあるときに TeX がカテゴリ コード 5 (行末) の文字に遭遇すると、TeX はトークンをまったく生成しません。
読み取り装置が状態 M にあるときに、TeX がカテゴリ コード 5 (行末) の文字に遭遇すると、TeX はスペース トークン、つまり、文字コードが 32 (スペース文字) で、カテゴリ コードが 10 (スペース) の文字トークンを生成します。
読み取り装置が状態 N にあるときに TeX がカテゴリ コード 5 (行末) の文字に遭遇すると、TeX は制御ワード トークンを生成します\par
。
カテゴリコード5(行末)の文字に遭遇すると、TeXは- 読み取り装置がどのような状態であっても -いずれにせよ、現在の行のそれ以上の情報を削除し、入力の別の行の読み取りを開始します。これにより、TeX の読み取り装置は状態 N に切り替わります。
上記の\endlinechar
-thingie により、通常、空でない行の後に空行が続くと、TeX はカテゴリ コードが 5 (行末) である 2 つの連続する改行文字 (文字コード 13) を処理することになります。
空でない行にある最初のリターン文字に遭遇した時点で、読み取り装置は状態Sまたは状態Mにある可能性があり、したがって最初のリターン文字はトークンをまったく生成しないか、スペーストークンを生成する可能性があります。
いずれにしても、最初のリターン文字に遭遇した後、読み取り装置は状態Nに切り替わります。したがって、これらの戻り文字の2番目に遭遇した時点で、読み取り装置は状態Nにあり、これらの戻り文字の2番目は制御ワードトークンを生成する \par
。
そのため、通常、空行は「段落区切り」のように扱われます。\par
これは通常 (再定義されていない場合)、これまでに収集された資料を行に分割し、テキストの段落としてタイプセットするための指示である制御ワード トークンのようなものです。
これは、段落内の最後の部分が、水平方向の接着を生成するスペース トークンになる可能性があることを意味します。段落の末尾にあるこのような水平方向の接着は通常、TeX によって破棄され、\parfillskip
段落の末尾には -glue-parameter の値に応じた接着が付加されることに注意してください。