4. 展開制御とは(2)
● TEX の展開の仕様
TEX は木構造を構築せずにトークン列を処理する.
defpair#1#2{(#1,#2)}
defenclose#1{[#1]}
( a , enclose ) b ( a , [ ) ] b
pair a enclose b
pair a [ b ] ( a , [ ) b ]
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日4 / 20
5. 展開制御とは(3)
● TEX の展開の仕様
TEX は木構造を構築せずにトークン列を処理する.
特に指定しなければ,前方から順に展開可能な限り展開していく.
defpair#1#2{(#1,#2)}
defenclose#1{[#1]}
( a , enclose ) b ( a , [ ) ] b
pair a enclose b
pair a [ b ] ( a , [ ) b ]
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日4 / 20
6. 展開制御とは(4)
●括弧の使用
TEX はトークン列を木構造として構築しないが,マクロには
“定義にマッチし,かつ括弧{ ・} が釣り合う最小部分を引数とする”
“1 個の引数全体が括弧で括られているときは展開後括弧を外す”
という仕様があるので,多くの場合は展開順序を意識しなくて済む.
(括弧を使うことで木構造に見せかけることができる)
pair { a x } { enclose { b y } }
( a x , enclose { b y } )
( a x , [ b y ] )
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日5 / 20
9. 展開制御の実践(3)
悪名高きexpandafter の登場!以降はX と略記
●“青赤モデル”の提案
可能な限り展開して進む青線と1 回だけ展開する赤線
●青線の展開規則
t !
8
:
t ( t が展開可能)
t ( t が展開不可能)
ただし赤線が存在する間は動かない
●expandafter の展開規則
X t1 t2 ! t1 t2
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日7 / 20
10. 展開制御の実践(4)
●赤線の展開規則(expandafter 以外)
t !
8
:
s1 sn ( t と引数! s1 sn )
t ( t が展開不可能)
先ほどの例も意図通り展開できる(めでたしめでたし)
X showdate X MMXIV X / texconfday ;
! X showdate X MMXIV X / texconfday ;
! showdate X MMXIV X / texconfday ;
! showdate MMXIV X / texconfday ;
! showdate MMXIV / texconfday ;
! showdate MMXIV / 1 1 / 0 8 ; A / B ;
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日8 / 20
13. 展開制御の実践(7)
どうしてX を挿入すべき位置がわかるのか
実は展開したい位置から逆算できる!
expandafter の展開規則
X t1 t2 ! t1 t2
を左右反転すると
t1 t2 X t1 t2
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 20
14. 展開制御の実践(8)
どうしてX を挿入すべき位置がわかるのか
実は展開したい位置から逆算できる!
expandafter の展開規則
X t1 t2 ! t1 t2
を左右反転すると
t1 t2 X t1 t2
……つまりt2 を展開したいときにこれを適用して
X を挿入していく
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 20
15. 展開制御の実践(9)
showdate MMXIV / texconfday ;
showdate MMXIV X / texconfday ;
showdate X MMXIV X / texconfday ;
X showdate X MMXIV X / texconfday ;
X showdate X MMXIV X / texconfday ;
無事逆算できた(当然といえば当然)
実際には複数の場所を先に展開したり,同じ位置を2 回展開したり
するが,基本的にはこの逆算がどんな場合でも使える!
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日10 / 20
21. 展開制御による構造化(5)
●“記法”?
例えば数理論理学:同一の論理式の異なる表記
個々人の流儀により違いがある
8x; y; z 2 L (x y ^ y z ff x z)
8x8y8z 2 L: ((x ≼ y ^ y ≼ z) ! x ≼ z)
記法に依存しない構造だけを取り出して,
記法はオプション的に指定したい!
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日14 / 20