Takashi SUWA 
(東京大学工学部計数工学科数理情報工学コース3 年) 
2014 年11 月08 日TEX ユーザの集い2014
自己紹介 
Takashi SUWA 
東京大学工学部計数工学科 
数理情報工学コース3 年 
どこにでもいる普通の学部生です. 
pLATEX 歴5 年(未熟) 
TEX 歴半年未満 
このスライドは,発表し 
た際に省略した部分の追 
加,一部情報の削除など 
を施しております. 
内容は個人的見解です. 
また,かなり大雑把な説明を含むこと,既にご存知の方にとっては 
釈迦に説法であることをご了承ください. 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日2 / 20
展開制御とは(1) 
● TEX の展開制御とは 
……TEX によるプリミティヴやマクロの展開が特定の順序に 
従って行なわれるように指定すること. 
●なぜ展開制御が必要なのか 
……TEX の言語仕様が展開に関して合流性を満たさないから. 
簡約の合流性のイメージ 
dbl(n) := n  2 
succ(n) := n + 1 
dbl(succ(4)) 
dbl(5) 10 
succ(4)  2 5  2 10 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日3 / 20
展開制御とは(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
展開制御とは(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
展開制御とは(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
展開制御の実践(1) 
defshowdate#1/#2/#3;{#1年#2月#3日} 
defMMXIV{2014} 
deftexconfday{11/08} と定義した下で, 
showdate MMXIV / texconfday ; A / B ; 
を展開すると 
2 0 1 4 年1 1 月0 8 日A / B ; 
…… 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日6 / 20
展開制御の実践(2) 
defshowdate#1/#2/#3;{#1年#2月#3日} 
defMMXIV{2014} 
deftexconfday{11/08} と定義した下で, 
showdate MMXIV / texconfday ; A / B ; 
を展開すると 
2 0 1 4 年1 1 月0 8 日A / B ; 
……かと思いきや 
2 0 1 4 年1 1 / 0 8 ; A 月B 日 
になってしまう! 
showdate よりも先にtexconfday を展開する必要がある 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日6 / 20
展開制御の実践(3) 
悪名高きexpandafter の登場!以降はX と略記 
●“青赤モデル”の提案 
可能な限り展開して進む青線と1 回だけ展開する赤線 
●青線の展開規則 
t ! 
8 
: 
t ( t が展開可能) 
t ( t が展開不可能) 
ただし赤線が存在する間は動かない 
●expandafter の展開規則 
X t1 t2 ! t1 t2 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日7 / 20
展開制御の実践(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
展開制御の実践(5) 
どうしてX を挿入すべき位置がわかるのか 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 20
展開制御の実践(6) 
どうしてX を挿入すべき位置がわかるのか 
実は展開したい位置から逆算できる! 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 20
展開制御の実践(7) 
どうしてX を挿入すべき位置がわかるのか 
実は展開したい位置から逆算できる! 
expandafter の展開規則 
X t1 t2 ! t1 t2 
を左右反転すると 
t1 t2   X t1 t2 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 20
展開制御の実践(8) 
どうしてX を挿入すべき位置がわかるのか 
実は展開したい位置から逆算できる! 
expandafter の展開規則 
X t1 t2 ! t1 t2 
を左右反転すると 
t1 t2   X t1 t2 
……つまりt2 を展開したいときにこれを適用して 
X を挿入していく 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 20
展開制御の実践(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
展開制御の実践(10) 
逆算さえできれば,展開制御も意外にこわくない! 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日11 / 20
展開制御による構造化(1) 
●結局,展開制御って何に使えるの? 
……def,let,csname~endcsname,ifx などの条件分岐, 
カウント変数と合わせて使うことで柔軟なマクロがつくれる! 
(数多くのパッケージやLATEX 自体もそうして創られている) 
特に個人的に強調したいのは 
高度なマークアップに使える 
ということ. 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日12 / 20
展開制御による構造化(2) 
よく言われる文書の構造・体裁分離 
HTML・CSS など 
構造 
体裁 
文書 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日13 / 20
展開制御による構造化(3) 
よく言われる文書の構造・体裁分離 
HTML・CSS など 
しかし本当にこれだけでよいのか? 
構造 
体裁 
文書 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日13 / 20
展開制御による構造化(4) 
構造・記法・体裁分離による 
さらに高度なマークアップへ 
構造 
記法 
体裁 
文書 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日13 / 20
展開制御による構造化(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
展開制御による構造化(6) 
●宣伝(?) 
そんな構想で自分なりに実装している試験的パッケージが 
gfncmd,gfnlf 
http://github.com/gfngfn/gfncmd 
gfncmd 検索 
(仕様書の整備は発表に間に合いませんでした(すみません)) 
実はさっきの論理式はどちらも同じトークン列で構造が書かれています 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日15 / 20
展開制御による構造化(7) 
8x; y; z 2 L (x  y ^ y  z ff x  z) 
  
useparensingleqtfr %量化子8,9 は先頭だけ,括弧必須 
usepreceqaspord %半順序を に 
useinvertedCaslimpl %論理包含をff に 
usenormalparen %括弧を普通のleft~right に... 
lfqtfr{ 
forallin{{x}{y}{z}}{L} 
}{ 
lflimpl{ 
lfland{lffml{x pord y}}{lffml{y pord z}} 
}{ 
lffml{x pord z} 
} 
} 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日16 / 20
展開制御による構造化(8) 
8x8y8z 2 L: ((x ≼ y ^ y ≼ z) ! x ≼ z) 
  
usedotpluralqtfr %量化子8,9 は全てつけ,末尾をドットに 
usepreccurlyeqaspord %半順序を≼ に 
useexpandingparen %括弧が外側ほど大きくなるようにする 
makeleftparenmandatory{lflimpl}{lfland} ... 
%論理包含の左辺にくる連言の括弧を省略しない 
lfqtfr{ 
forallin{{x}{y}{z}}{L} 
}{ 
lflimpl{ 
lfland{lffml{x pord y}}{lffml{y pord z}} 
}{ 
lffml{x pord z} 
} 
} 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日17 / 20
展開制御による構造化(9) 
●利点 
保守性が高い.気分次第で簡単に記法を変更できる 
複数人で文書をつくるときも記法統一が容易 
他人がつくった文書も自分の好きな記法で読めるかも(好きなオプ 
ションを指定して送信すると 
他人の打った文書が指定通りに組まれて 
送られてくるシステムなどがつくれる) 
●欠点 
使い手にリテラシーを要求する 
記法により配置が大きく変わるときに調整困難 
(人工知能並みの組版最適化がコンパイラに求められる) 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日18 / 20
展開制御による構造化(10) 
記法に依存する処理は 
どんどんマクロ化して 
エレガントに構造化された 
文書を打とう! 
最適化さえ充実させれば,構造化は大正義 
Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日19 / 20
ありがとうございました 
●主要参考文献(敬称略) 
藤田眞作『LATEX2 マクロ作法』 
マクロツイーター 
http://d.hatena.ne.jp/zrbabbler

TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)

  • 1.
    Takashi SUWA (東京大学工学部計数工学科数理情報工学コース3年) 2014 年11 月08 日TEX ユーザの集い2014
  • 2.
    自己紹介 Takashi SUWA 東京大学工学部計数工学科 数理情報工学コース3 年 どこにでもいる普通の学部生です. pLATEX 歴5 年(未熟) TEX 歴半年未満 このスライドは,発表し た際に省略した部分の追 加,一部情報の削除など を施しております. 内容は個人的見解です. また,かなり大雑把な説明を含むこと,既にご存知の方にとっては 釈迦に説法であることをご了承ください. Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日2 / 20
  • 3.
    展開制御とは(1) ● TEXの展開制御とは ……TEX によるプリミティヴやマクロの展開が特定の順序に 従って行なわれるように指定すること. ●なぜ展開制御が必要なのか ……TEX の言語仕様が展開に関して合流性を満たさないから. 簡約の合流性のイメージ dbl(n) := n 2 succ(n) := n + 1 dbl(succ(4)) dbl(5) 10 succ(4) 2 5 2 10 Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日3 / 20
  • 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
  • 7.
    展開制御の実践(1) defshowdate#1/#2/#3;{#1年#2月#3日} defMMXIV{2014} deftexconfday{11/08} と定義した下で, showdate MMXIV / texconfday ; A / B ; を展開すると 2 0 1 4 年1 1 月0 8 日A / B ; …… Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日6 / 20
  • 8.
    展開制御の実践(2) defshowdate#1/#2/#3;{#1年#2月#3日} defMMXIV{2014} deftexconfday{11/08} と定義した下で, showdate MMXIV / texconfday ; A / B ; を展開すると 2 0 1 4 年1 1 月0 8 日A / B ; ……かと思いきや 2 0 1 4 年1 1 / 0 8 ; A 月B 日 になってしまう! showdate よりも先にtexconfday を展開する必要がある Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日6 / 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
  • 11.
    展開制御の実践(5) どうしてX を挿入すべき位置がわかるのか Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 20
  • 12.
    展開制御の実践(6) どうしてX を挿入すべき位置がわかるのか 実は展開したい位置から逆算できる! Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日9 / 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
  • 16.
    展開制御の実践(10) 逆算さえできれば,展開制御も意外にこわくない! TakashiSUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日11 / 20
  • 17.
    展開制御による構造化(1) ●結局,展開制御って何に使えるの? ……def,let,csname~endcsname,ifxなどの条件分岐, カウント変数と合わせて使うことで柔軟なマクロがつくれる! (数多くのパッケージやLATEX 自体もそうして創られている) 特に個人的に強調したいのは 高度なマークアップに使える ということ. Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日12 / 20
  • 18.
    展開制御による構造化(2) よく言われる文書の構造・体裁分離 HTML・CSSなど 構造 体裁 文書 Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日13 / 20
  • 19.
    展開制御による構造化(3) よく言われる文書の構造・体裁分離 HTML・CSSなど しかし本当にこれだけでよいのか? 構造 体裁 文書 Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日13 / 20
  • 20.
    展開制御による構造化(4) 構造・記法・体裁分離による さらに高度なマークアップへ 構造 記法 体裁 文書 Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日13 / 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
  • 22.
    展開制御による構造化(6) ●宣伝(?) そんな構想で自分なりに実装している試験的パッケージが gfncmd,gfnlf http://github.com/gfngfn/gfncmd gfncmd 検索 (仕様書の整備は発表に間に合いませんでした(すみません)) 実はさっきの論理式はどちらも同じトークン列で構造が書かれています Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日15 / 20
  • 23.
    展開制御による構造化(7) 8x; y;z 2 L (x y ^ y z ff x z) useparensingleqtfr %量化子8,9 は先頭だけ,括弧必須 usepreceqaspord %半順序を に useinvertedCaslimpl %論理包含をff に usenormalparen %括弧を普通のleft~right に... lfqtfr{ forallin{{x}{y}{z}}{L} }{ lflimpl{ lfland{lffml{x pord y}}{lffml{y pord z}} }{ lffml{x pord z} } } Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日16 / 20
  • 24.
    展開制御による構造化(8) 8x8y8z 2L: ((x ≼ y ^ y ≼ z) ! x ≼ z) usedotpluralqtfr %量化子8,9 は全てつけ,末尾をドットに usepreccurlyeqaspord %半順序を≼ に useexpandingparen %括弧が外側ほど大きくなるようにする makeleftparenmandatory{lflimpl}{lfland} ... %論理包含の左辺にくる連言の括弧を省略しない lfqtfr{ forallin{{x}{y}{z}}{L} }{ lflimpl{ lfland{lffml{x pord y}}{lffml{y pord z}} }{ lffml{x pord z} } } Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日17 / 20
  • 25.
    展開制御による構造化(9) ●利点 保守性が高い.気分次第で簡単に記法を変更できる 複数人で文書をつくるときも記法統一が容易 他人がつくった文書も自分の好きな記法で読めるかも(好きなオプ ションを指定して送信すると 他人の打った文書が指定通りに組まれて 送られてくるシステムなどがつくれる) ●欠点 使い手にリテラシーを要求する 記法により配置が大きく変わるときに調整困難 (人工知能並みの組版最適化がコンパイラに求められる) Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日18 / 20
  • 26.
    展開制御による構造化(10) 記法に依存する処理は どんどんマクロ化して エレガントに構造化された 文書を打とう! 最適化さえ充実させれば,構造化は大正義 Takashi SUWA (東京大学工学部) TeX 言語の展開制御による文書の構造化2014 年11 月08 日19 / 20
  • 27.
    ありがとうございました ●主要参考文献(敬称略) 藤田眞作『LATEX2マクロ作法』 マクロツイーター http://d.hatena.ne.jp/zrbabbler