SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
Kota Mizushima
 
パターン認識02 k平均法ver2.0
パターン認識02 k平均法ver2.0パターン認識02 k平均法ver2.0
パターン認識02 k平均法ver2.0
sleipnir002
 
5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet
Nagi Teramo
 
量子オートマトンの計算能力
量子オートマトンの計算能力量子オートマトンの計算能力
量子オートマトンの計算能力
YuuOkano
 

La actualidad más candente (20)

llvm入門
llvm入門llvm入門
llvm入門
 
Rによるベイジアンネットワーク入門
Rによるベイジアンネットワーク入門Rによるベイジアンネットワーク入門
Rによるベイジアンネットワーク入門
 
統計的学習の基礎6章前半 #カステラ本
統計的学習の基礎6章前半 #カステラ本統計的学習の基礎6章前半 #カステラ本
統計的学習の基礎6章前半 #カステラ本
 
統計的学習の基礎 5章前半(~5.6)
統計的学習の基礎 5章前半(~5.6)統計的学習の基礎 5章前半(~5.6)
統計的学習の基礎 5章前半(~5.6)
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
連続最適化勉強会
連続最適化勉強会連続最適化勉強会
連続最適化勉強会
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成
 
ベイズ統計学の概論的紹介
ベイズ統計学の概論的紹介ベイズ統計学の概論的紹介
ベイズ統計学の概論的紹介
 
パターン認識02 k平均法ver2.0
パターン認識02 k平均法ver2.0パターン認識02 k平均法ver2.0
パターン認識02 k平均法ver2.0
 
SATySFi 最近の発展と目下実装中の変更
SATySFi 最近の発展と目下実装中の変更SATySFi 最近の発展と目下実装中の変更
SATySFi 最近の発展と目下実装中の変更
 
【解説】 一般逆行列
【解説】 一般逆行列【解説】 一般逆行列
【解説】 一般逆行列
 
5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
マルコフ連鎖モンテカルロ法 (2/3はベイズ推定の話)
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
 
TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介
 
量子オートマトンの計算能力
量子オートマトンの計算能力量子オートマトンの計算能力
量子オートマトンの計算能力
 

Destacado

Unicode絵文字とキャリア絵文字
Unicode絵文字とキャリア絵文字Unicode絵文字とキャリア絵文字
Unicode絵文字とキャリア絵文字
宏章 大橋
 

Destacado (19)

プログラミングTeX
プログラミングTeXプログラミングTeX
プログラミングTeX
 
Macrodown -MLが使えるML-
Macrodown -MLが使えるML-Macrodown -MLが使えるML-
Macrodown -MLが使えるML-
 
TeX in educational institutes (TUG 2013)
TeX in educational institutes (TUG 2013)TeX in educational institutes (TUG 2013)
TeX in educational institutes (TUG 2013)
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド
 
tcolorboxによる装飾表現(TeXユーザの集い2015)
tcolorboxによる装飾表現(TeXユーザの集い2015)tcolorboxによる装飾表現(TeXユーザの集い2015)
tcolorboxによる装飾表現(TeXユーザの集い2015)
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門
 
Development of TeXShop - The Past and the Future (TUG 2013)
Development of TeXShop - The Past and the Future (TUG 2013)Development of TeXShop - The Past and the Future (TUG 2013)
Development of TeXShop - The Past and the Future (TUG 2013)
 
The history of TeX and its recent advances
The history of TeX and its recent advancesThe history of TeX and its recent advances
The history of TeX and its recent advances
 
試練に立つ Unicodeの絵文字
試練に立つ Unicodeの絵文字試練に立つ Unicodeの絵文字
試練に立つ Unicodeの絵文字
 
TeXユーザの集い2014 発表資料(W3C Ruby)
TeXユーザの集い2014 発表資料(W3C Ruby)TeXユーザの集い2014 発表資料(W3C Ruby)
TeXユーザの集い2014 発表資料(W3C Ruby)
 
人種差別の指摘にゆれるUnicodeの絵文字
人種差別の指摘にゆれるUnicodeの絵文字人種差別の指摘にゆれるUnicodeの絵文字
人種差別の指摘にゆれるUnicodeの絵文字
 
Unicode絵文字とキャリア絵文字
Unicode絵文字とキャリア絵文字Unicode絵文字とキャリア絵文字
Unicode絵文字とキャリア絵文字
 
とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法
 
Lyxを用いた文書作成
Lyxを用いた文書作成Lyxを用いた文書作成
Lyxを用いた文書作成
 
20分で学ぶTeX & LaTeX
20分で学ぶTeX & LaTeX20分で学ぶTeX & LaTeX
20分で学ぶTeX & LaTeX
 
書籍向け汎用マークアップのあり方―Re:VIEWの開発を通して
書籍向け汎用マークアップのあり方―Re:VIEWの開発を通して書籍向け汎用マークアップのあり方―Re:VIEWの開発を通して
書籍向け汎用マークアップのあり方―Re:VIEWの開発を通して
 
TEX マクロプログラミング
TEX マクロプログラミングTEX マクロプログラミング
TEX マクロプログラミング
 
一般的なチートの手法と対策について
一般的なチートの手法と対策について一般的なチートの手法と対策について
一般的なチートの手法と対策について
 
見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版
 

Más de T. Suwa

Más de T. Suwa (6)

静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
 
SATySFiのこれからの課題たち
SATySFiのこれからの課題たちSATySFiのこれからの課題たち
SATySFiのこれからの課題たち
 
多段階計算の型システムの基礎
多段階計算の型システムの基礎多段階計算の型システムの基礎
多段階計算の型システムの基礎
 
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
 
ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論
 
レコード計算の多相型システムと型推論
レコード計算の多相型システムと型推論レコード計算の多相型システムと型推論
レコード計算の多相型システムと型推論
 

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) 逆算さえできれば,展開制御も意外にこわくない! Takashi SUWA (東京大学工学部) 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 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
  • 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