SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化Proktmr
 
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜SSII
 
強化学習その1
強化学習その1強化学習その1
強化学習その1nishio
 
定理証明支援系Coqについて
定理証明支援系Coqについて定理証明支援系Coqについて
定理証明支援系CoqについてYoshihiro Mizoguchi
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みMasahiro Sakai
 
CRC-32
CRC-32CRC-32
CRC-327shi
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement LearningPreferred Networks
 
zk-SNARKsの仕組みについて
zk-SNARKsの仕組みについてzk-SNARKsの仕組みについて
zk-SNARKsの仕組みについてts21
 

Was ist angesagt? (20)

いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
Chokudai search
Chokudai searchChokudai search
Chokudai search
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化
 
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
SSII2021 [TS2] 深層強化学習 〜 強化学習の基礎から応用まで 〜
 
強化学習その1
強化学習その1強化学習その1
強化学習その1
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
定理証明支援系Coqについて
定理証明支援系Coqについて定理証明支援系Coqについて
定理証明支援系Coqについて
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
π計算
π計算π計算
π計算
 
CRC-32
CRC-32CRC-32
CRC-32
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
zk-SNARKsの仕組みについて
zk-SNARKsの仕組みについてzk-SNARKsの仕組みについて
zk-SNARKsの仕組みについて
 

Andere mochten auch

Macrodown -MLが使えるML-
Macrodown -MLが使えるML-Macrodown -MLが使えるML-
Macrodown -MLが使えるML-T. Suwa
 
TeX in educational institutes (TUG 2013)
TeX in educational institutes (TUG 2013)TeX in educational institutes (TUG 2013)
TeX in educational institutes (TUG 2013)Yasuhide Minoda
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナドYoshihiro Mizoguchi
 
tcolorboxによる装飾表現(TeXユーザの集い2015)
tcolorboxによる装飾表現(TeXユーザの集い2015)tcolorboxによる装飾表現(TeXユーザの集い2015)
tcolorboxによる装飾表現(TeXユーザの集い2015)TeXmedicine
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門Eita Sugimoto
 
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)Yusuke Terada
 
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 advancesYusuke Terada
 
試練に立つ Unicodeの絵文字
試練に立つ Unicodeの絵文字試練に立つ Unicodeの絵文字
試練に立つ Unicodeの絵文字Katsuhiro OGATA
 
TeXユーザの集い2014 発表資料(W3C Ruby)
TeXユーザの集い2014 発表資料(W3C Ruby)TeXユーザの集い2014 発表資料(W3C Ruby)
TeXユーザの集い2014 発表資料(W3C Ruby)Taichi Kawabata
 
人種差別の指摘にゆれるUnicodeの絵文字
人種差別の指摘にゆれるUnicodeの絵文字人種差別の指摘にゆれるUnicodeの絵文字
人種差別の指摘にゆれるUnicodeの絵文字Katsuhiro OGATA
 
Unicode絵文字とキャリア絵文字
Unicode絵文字とキャリア絵文字Unicode絵文字とキャリア絵文字
Unicode絵文字とキャリア絵文字宏章 大橋
 
とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法とある制作会社の目次索引作成技法
とある制作会社の目次索引作成技法Kenshi Muto
 
Lyxを用いた文書作成
Lyxを用いた文書作成Lyxを用いた文書作成
Lyxを用いた文書作成Yu Sato
 
書籍向け汎用マークアップのあり方―Re:VIEWの開発を通して
書籍向け汎用マークアップのあり方―Re:VIEWの開発を通して書籍向け汎用マークアップのあり方―Re:VIEWの開発を通して
書籍向け汎用マークアップのあり方―Re:VIEWの開発を通してKenshi Muto
 
TEX マクロプログラミング
TEX マクロプログラミングTEX マクロプログラミング
TEX マクロプログラミングKoh Uehara
 
一般的なチートの手法と対策について
一般的なチートの手法と対策について一般的なチートの手法と対策について
一般的なチートの手法と対策について優介 黒河
 
見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版MOCKS | Yuta Morishige
 

Andere mochten auch (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 マクロプログラミング
 
一般的なチートの手法と対策について
一般的なチートの手法と対策について一般的なチートの手法と対策について
一般的なチートの手法と対策について
 
見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版
 

Mehr von T. Suwa

PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介T. Suwa
 
SATySFi 最近の発展と目下実装中の変更
SATySFi 最近の発展と目下実装中の変更SATySFi 最近の発展と目下実装中の変更
SATySFi 最近の発展と目下実装中の変更T. Suwa
 
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi: その後の発展と今後の課題 @第62回プログラミング・シンポジウムT. Suwa
 
SATySFiのこれからの課題たち
SATySFiのこれからの課題たちSATySFiのこれからの課題たち
SATySFiのこれからの課題たちT. Suwa
 
多段階計算の型システムの基礎
多段階計算の型システムの基礎多段階計算の型システムの基礎
多段階計算の型システムの基礎T. Suwa
 
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウム
静的型つき組版処理システムSATySFi @第61回プログラミング・シンポジウムT. Suwa
 
ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論ラベルなしオプション引数の型システムと型推論
ラベルなしオプション引数の型システムと型推論T. Suwa
 
レコード計算の多相型システムと型推論
レコード計算の多相型システムと型推論レコード計算の多相型システムと型推論
レコード計算の多相型システムと型推論T. Suwa
 

Mehr von T. Suwa (8)

PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
 
SATySFi 最近の発展と目下実装中の変更
SATySFi 最近の発展と目下実装中の変更SATySFi 最近の発展と目下実装中の変更
SATySFi 最近の発展と目下実装中の変更
 
静的型つき組版処理システム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