gfngfn
45:4'*ʢαςΟεϑΝΠʣͱ͸
w ߨԋऀ͕೥౓*1ະ౿ࣄ‫ۀ‬ͷϓϩδΣΫτͱͯ͠։ൃͨ͠
ൺֱత৽͍͠૊൛ॲཧγεςϜ
w ੩త‫͖ͭܕ‬ͷ͍ΘΏΔവ਺‫ܕ‬ͷϓϩάϥϛϯά‫Ͱޠݴ‬
ύοέʔδ΍จॻຊମ͕ॻ͚Δ
r ҰൠతͳϓϩάϥϜͱಉ͡ཁྖͰಡΈॻ͖Ͱ͖ΔͷͰ
ΧελϚΠζੑ͕ߴ͍
w DG59-
59ɿෳࡶͳҙຯ࿦Ώ͑ʹύοέʔδ࡞੒ʹ͸஁࿉Λཁ͢Δ্ɼ
ख़࿅ऀͰ΋ଞਓͷॻ͍࣮ͨ૷͸ಡΜͰվม͢Δͷ͕೉͍͠
r ‫هͨͬޡ‬ड़Λͨ͠ͱ͖΋ɼ‫ʹࠪݕܕ‬Αͬͯਝ଎ʢయ‫ܕ‬తʹ͸ඵ΄Ͳʣ
͔ͭ‫ݪ‬ҼͷղΓ΍͍͢ΤϥʔใࠂΛग़ͯ͘͠ΕΔ܏޲ʹ͋Δ
w DG59-
59ɿࠣࡉͳϛεͰ΋े਺ඵ଴͔ͬͯΒղΓʹ͍͘Τϥʔ͕ग़͕ͪ
֓ཁ
45:4'*ͷ঺հ
w ։ൃಈ‫ػ‬ɾ໨తҙࣝͷ‫ڞ‬༗
w 11-ʹࢀՃ͞ΕΔํʑͷؔ৺ͱরΒ͠߹Θͤɼ
૊൛ॲཧɾจॻ࡞੒ͱ͍ͬͨ༻్ʹཁ੥͞Εͯ
45:4'*ʹͲΜͳEPNBJOTQFDJpDͳҙຯ࿦΍‫ܕ‬γεςϜ͕
౥ࡌ͞Ε͍ͯΔ͔Λ֓આ
w ͦͷଞɼ༗ࢤͷํʑʹΑΔ45:4'*ύοέʔδ΍पลπʔϧͷ঺հ
ຊߨԋͷ಺༰
w։ൃಈ‫ػ‬ɾ໨తҙࣝ
w ಈ࡞σϞ
w จࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
w จॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
w ߦ෼ׂॲཧͷ࢓૊Έ
w ଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w ༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w ·ͱΊ
໨࣍
େผͯ͠छྨɿ
จॻ࡞੒ιϑτ΢ΣΞͷ‫ܗ‬ଶ

8:4*8:(ΤσΟλ
ϚʔΫΞοϓ‫ޠݴ‬ʴॲཧ‫ܥ‬
troff [Microsoft 1983] [Adobe 1991]
[Quark 1987]
[Lamport 1985]
[Knuth 1978]
[Gruber 2004]
[Osanna 1973]
ɾ
RE:VIEW
[੨໦ et al. 2002]
લॲཧ༻్
8:4*8:(ΤσΟλํࣜͱൺ΂ͯɼ܏޲ͱͯ͠ɿ
ϚʔΫΞοϓ‫ࣜํޠݴ‬ͷੑ࣭

😄 😩
• Ϣʔβ͕ෆద֨ͳίʔυΛ
ೖྗͱͯ͠༩͑΍͍͢
• ࠩ෼؅ཧ͕୯७
• ϢʔβఆٛίϚϯυʹΑΓɿ
• ෳࡶͳࣗಈॲཧ͕࣮‫ݱ‬Մೳ
• จॻͷମࡋ͕
‫͔ޙ‬ΒॊೈʹมߋՄೳ
͜ͷಛ௃Λ‫͍͔ͨ͠׆‬ਓ͕૝ఆϢʔβ ͲͷΑ͏ʹΤϥʔ͕ใࠂ͞ΕΔ͔͕
ࣥචޮ཰ʹӨ‫ڹ‬
ྫɿ59-
59
w Τϥʔใࠂ͕ෆ਌੾Ͱ஗͍܏޲ʹ͋Δ
r ͜ΕΏ͑ʹɼগ͠‫ॲͨͬڽ‬ཧΛఆٛ͠Α͏ͱ͢Δͱσόοά͕ࠔ೉
r ॲཧ‫ܥ‬ͷ࣮૷͕ଵଦͳͷͰ͸ͳ͘ɼ59ͷ΋ͭૢ࡞తҙຯ࿦ͷ౎߹্
ෆ਌੾ͳΤϥʔʹͳΒ͟ΔΛಘͳ͍ͱ͍͏ଆ໘͕େ͖͍
खͷࠐΜͩࣗಈॲཧ͕ఆٛͰ͖ͭͭɼl໌Β͔ͳϛεzʹ͸਌੾ͳΤϥʔ͕
ग़ͤΔΑ͏ͳߏจɾҙຯ࿦ͷ‫͍ͨ͠ʹޠݴ‬
‫ط‬ଘγεςϜͷऑ఺

! Undefined control sequence.
! Missing $ inserted.
! Missing number, treated as zero.
੩త‫Ͱ͖ͭܕ‬ɼ59-
59ίʔυΛग़ྗ͢ΔΑ͏ͳ
‫ޠݴ‬Λ૑Ε͹Α͍ͷͰ͸ͳ͍͔ʁ
೥ࠒʹ.BDSPEPXOͱ͍͏.-‫͠૷࣮ͯ͠ͱޠݴܥ‬ɼ
ͦΕͳΓʹ࢖͑Δ΋ͷʹ͸ͳͬͨ
‫ࡏݦ‬Խͨ͠ऑ఺ɿ
w ϖʔδ਺΍ࢴ໘্ͷ෯ͱ͍ͬͨ૊൛্ͷ֓೦ʹґଘ͢Δॲཧ͸
XSBQQFSଆͰ࣮૷͠ʹ͘͘ɼґવͱͯ͠-59ଆͰͷ࣮૷͕ඞཁ
r ಛʹΫϥεϑΝΠϧͷ࣮૷ͳͲ͸XSBQQFSଆͰ͸౸ఈ‫͍ͳ݁͠׬‬͸ͣ
࠷ॳͷҊɿ‫͖ͭܕ‬ͷXSBQQFSΛͭ͘Δ
XSBQQFS‫͕ޠݴ‬༩͑ʹ͔ͬͨ͘ΓΤϥʔใࠂ͕ෆ਌੾ͩͬͨΓ͢Δ
ཁҼ͸ɼओʹ59ͷ΋ͭૢ࡞తҙຯ࿦ͷෳࡶո‫͋ʹ͞ح‬Δɿ
w ࣈ۟ղੳʹ͍ۙ͜ͱ͸͢Δ͕ɼந৅ߏจ໦ͷ֓೦͸ͳ͍
w ੍‫ޚ‬௲ʢfooʣͷల։͸‫ޙ‬ଓτʔΫϯྻʹର͢ΔύλʔϯϚονϯά
r l‫{ހׅ‬ʜ}͕௼Γ߹͍ύλʔϯʹ߹க͢Δ࠷୹ͷτʔΫϯྻzΛҾ਺ͱΈͳ͢
w ഁյతʹมߋՄೳͳม਺ͷ‫͕ߏػ‬ଟ༻͞ΕΔ
w ࣈ۟ղੳ͸lMB[ZzͰɼલํͰධՁ૬౰ͷॲཧ͕ߦͳΘΕ͍ͯͯ΋
‫ํޙ‬͸·ͩτʔΫϯԽ͞Ε͍ͯͳ͍จࣈྻͰ͋Γɼ
લํͷධՁ݁Ռ͕‫ํޙ‬ͷࣈ۟ղੳํ๏Λมߋ͠͏Δ
w Ҏ্ͷΑ͏ͳෳࡶͳ‫͕ߏػ‬૊൛ॲཧͱີ݁߹Ͱɼආ͚ʹ͍͘
੩తʹಛఆͷੑ࣭Λอূ͢Δͱ͍͏ࢼΈ͸͋·Γ๬Έ͕࣋ͯͳ͍
খ͍͞αϒηοτͰ΋͋·Γ‫͍ڧ‬อূ͸Ͱ͖ͳ͍༷ࢠSEXFH0TUFSNBOO
l59‫ޠݴ‬zͷૢ࡞తҙຯ࿦ͷ֓આ
-
59όοΫΤϯυΛXSBQͨ͠‫ʹͣͤ·ࡁͰޠݴ‬ɼ
ࣗલͰ૊൛ॲཧ·Ͱߦͳ͑Δ‫ॲͱޠݴ‬ཧ‫ܥ‬Λઃ‫ܭ‬ɾ࣮૷͍ͨ͠
ओཁͳཁ݅ɿ
w ຊ࣭తʹ૊൛ॲཧʹؔΘΔΑ͏ͳෳࡶͳࣗಈॲཧ͕Ͱ͖Δ͜ͱ
r ଞਓͷॻ͍ͨࣗಈॲཧͷ࣮૷΋େ͖ͳࢧোͳ͘ಡΜͰվม͠΍͍͢͜ͱ΋‫ؚ‬Ή
w ໌Β͔ͳΤϥʔʹ͍ͭͯ͸੩తʹʢʹ૊൛ॲཧΛ࢝ΊΔΑΓલʹʣ‫ݕ‬஌͠ɼ
ͦͷ‫ݪ‬ҼΛͳΔ΂͘ಛఆ͠΍͍͢‫Ͱܗ‬ใࠂͰ͖Δ͜ͱ
໨తҙࣝ
(*‫ͯ͑׶‬΍΍௅ઓతʹॻ͘ͳΒɿ
w 59-
59͸΋ͪΖΜ҃Δ໘Ͱ͸ૉ੖Β͍͠ιϑτ΢ΣΞ͕ͩɼ
͜Ε͚ͩ‫ޠݴ‬ઃ‫ܭ‬ͷ஌‫͍ͯͬ·ཷ͕ݟ‬Δ‫Ͱࡏݱ‬΋
ѻ͍ʹ͍͘ҙຯ࿦Λ΋ͭ59ʹͣͬͱґଘ͠ଓ͚Δͷ͸
޻ֶతʹ݈શͳঢ়ଶͱ͸‫͍͘ʹ͍ݴ‬ͷͰ͸ͳ͍͔ʁ
r DG൚༻ͷ‫Ͱޠݴػࢉܭ‬͸༷ʑͳ‫ޠݴ‬ઃ‫͕ܭ‬೔໷ఏҊ͞Ε͍ͯΔ
w ೔ʑϓϩάϥϜͷੑ࣭Λ੩తʹอূ͢Δ͜ͱΛͻͨ͢Β೤৺ʹ
ߟ͍͑ͯΔͷʹɼ͍͟࿦จΛॻ͘ࡍͷಓ۩Ͱ͸ͦͷ݁ՌΛ‫ڗ‬डͤͣ
ෆ਌੾ͳΤϥʔ͹͔Γ‫͍ͯݟ‬Δͷ͸ɼࠠ԰ͷന‫Ͱއ‬͸ͳ͍͔ʁ
*)
ऄ଍ɿ΋ͬͱࡶͳ໰୊ҙࣝ
৽͍͠૊൛ॲཧγεςϜ
੒Ռ෺

https://github.com/gfngfn/SATySFi
Static Analysis-based TYpesetting System
for Functional Implementation
ʢ͔ͳΓ‫ڧ‬Ҿͳ͚ͭ͜͡ʣ
ߏจ͕େผͯ͠૚ʹ෼͔Ε͍ͯΔ
ಛ௃

+section{SATySFi;ͷ‫}ྫߘݪ‬
+p{
PPLͰ͸emph{2ճ໨ͷൃද}Ͱ͢ɽ
͓ੈ࿩ʹͳΓ·͢ɽ
}

let-inline ctx emph it =
let ctx =
ctx | set-font
Latin italic-font
in
read-inline ctx it
lϚʔΫΞοϓ૚z lϓϩάϥϜ૚z
• -59෩
• ΠϯϥΠϯ{ʜ}ͱ
ϒϩοΫʜͷ۠ผ͕͋Δ
• 0$BNM෩
lϓϩάϥϜ૚zͰ͸ίϚϯυఆ͕ٛ0$BNM෩ͷ‫͚ॻͰޠݴ‬Δ
w lάϩʔόϧͳঢ়ଶzΛ͋·Γ‫ॲʹͣͤʹؾ‬ཧ͕ॻ͚Δ
r ˞ࢭΉΛಘͣNVUBCMFSFGFSFODFͷ‫ػ‬ೳ͸͋Γɼ࠾൪ͳͲʹ࢖༻
w ‫ܕ‬γεςϜΛ༻͍ͨ੩తͳʢʹ૊൛ॲཧʹઌཱͬͨʣΤϥʔใࠂೳྗ
r ௨ৗͷMFUଟ૬ʴЋఔ౓
w Ϩίʔυ‫ࢉܭ‬0IPSJ3ÉNZ(BTUFS+POFT
w ΦϓγϣϯҾ਺
r ґଘ‫ܕ‬΍ᝲ‫ܕ‬͸ແ͠
r ૊൛ॲཧ΍υΩϡϝϯτॲཧʹؔΘΔଟ਺ͷ‫ج‬ຊ‫ͱܕ‬૊ࠐΈവ਺
w ͜Ε͕ࠓճ঺հ͢Δओͳର৅
ಛ௃
w ։ൃಈ‫ػ‬ɾ໨తҙࣝ
wಈ࡞σϞ
w จࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
w จॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
w ߦ෼ׂॲཧͷ࢓૊Έ
w ଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w ༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w ·ͱΊ
໨࣍
ಈ࡞σϞɿਖ਼ৗ‫ܥ‬

ʢσϞө૾ɿhttps://drive.google.com/file/d/
1muaWGgyAGfIYJNyKfKvvAzN8vur1sTG3/view?usp=sharingʣ
ҎԼͷΑ͏ͳʮ͍Ζ͸ՎΛ෯DNͷ࿮Ͱғͬͯ૊Ήʯग़ྗΛ͠Α͏ͱͯ͠
΍Γ͕ͪͳෆద֨ͳίʔυΛॻ͍ͯ͠·ͬͨͱ͖ͷΤϥʔใࠂΛ
-
59ͱ45:4'*Ͱൺֱ
ಈ࡞σϞɿҟৗ‫ܥ‬
-
59ͷ৔߹

ʢσϞө૾ɿhttps://drive.google.com/file/d/
1r14gHwCUxe3DQjoxkGHDWWkwtHWqMwaY/view?usp=sharingʣ
45:4'*ͷ৔߹

ʢσϞө૾ɿhttps://drive.google.com/file/d/
1DyKB0V2xIKz6SMYNGdEWnupPAxXkWCeE/view?usp=sharingʣ
w ։ൃಈ‫ػ‬ɾ໨తҙࣝ
w ಈ࡞σϞ
wจࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
w จॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
w ߦ෼ׂॲཧͷ࢓૊Έ
w ଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w ༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w ·ͱΊ
໨࣍
ϑϩϯτΤϯυʢ‫ߏػࠪݕ‬ʣʴόοΫΤϯυʢΠϯλϓϦλʣ
ॲཧ‫ܥ‬ͷߏ੒ͷ໛ࣜਤ

֤ϖʔδͷ಺༰
ϖʔδ෼ׂॲཧ
ߦͷ࿈ͳΓ
ߦ෼ׂॲཧ
“ശ” ͷਫฏͳ࿈ͳΓ
ม‫ث׵‬
PDFग़ྗ‫ߏػ‬
OpenType
ϑΥϯτ
ʢίϚϯυΛ‫ؚ‬Ήʣ
ςΩετ
ධՁ‫ث‬
จॻ
ίϚϯυू
ߏจ
ղੳ‫ث‬
‫ثࠪݕܕ‬
ύοέʔδ‫܈‬
ॲཧ‫ܥ‬ͷߏ੒ͷ໛ࣜਤ
֤ϖʔδͷ಺༰
ϖʔδ෼ׂॲཧ
ߦͷ࿈ͳΓ
ߦ෼ׂॲཧ
“ശ” ͷਫฏͳ࿈ͳΓ
ม‫ث׵‬
PDFग़ྗ‫ߏػ‬
จॻ
ίϚϯυू
OpenType
ϑΥϯτ
ʢίϚϯυΛ‫ؚ‬Ήʣ
ςΩετ
ධՁ‫ث‬
ߏจ
ղੳ‫ث‬
‫ثࠪݕܕ‬
ύοέʔδ‫܈‬
ϑϩϯτΤϯυʢ‫ߏػࠪݕ‬ʣʴόοΫΤϯυʢΠϯλϓϦλʣ
ॲཧ‫ܥ‬ͷߏ੒ͷ໛ࣜਤ

֤ϖʔδͷ಺༰
ϖʔδ෼ׂॲཧ
ߦͷ࿈ͳΓ
ߦ෼ׂॲཧ
“ശ” ͷਫฏͳ࿈ͳΓ
ม‫ث׵‬
PDFग़ྗ‫ߏػ‬
OpenType
ϑΥϯτ
ʢίϚϯυΛ‫ؚ‬Ήʣ
ςΩετ
ධՁ‫ث‬
‫ثࠪݕܕ‬
{The quick brown fox ʜ }
ʜ
ʜ
ʜ
ॲཧ‫ܥ‬ͷߏ੒ͷ໛ࣜਤ

֤ϖʔδͷ಺༰
ϖʔδ෼ׂॲཧ
ߦͷ࿈ͳΓ
ߦ෼ׂॲཧ
“ശ” ͷਫฏͳ࿈ͳΓ
ม‫ث׵‬
PDFग़ྗ‫ߏػ‬
OpenType
ϑΥϯτ
ʢίϚϯυΛ‫ؚ‬Ήʣ
ςΩετ
ධՁ‫ث‬
‫ثࠪݕܕ‬
ࣗಈॲཧͷ࣮૷Ͱ͸
͜ͷ͋ͨΓͷ૊൛ॲཧʹ
հೖͰ͖ͯ΄͍͠
ࣗಈॲཧͷఆ͕ٛ‫ʹࠪݕܕ‬௨Ε͹ɼ
ධՁ࣌ʹ͜͜Ͱ
σʔλͷෆ੔߹͕‫͍ͳ͖ى‬Α͏ͳ
‫ܕ‬γεςϜΛ༻ҙ͍ͨ͠
Ұൠͷ૊൛ॲཧʹԙ͚Δจࣈͷѻ͍ํ
ϕʔεϥΠϯ
ࢀর఺
άϦϑgͷ
ਐߦ෯
࣍ͷࢀর఺
Ξ΢τϥΠϯΛͳ͢
ͭͷ#É[JFS‫ۂ‬ઢ͕
ͭ͘ΔgͷྖҬ
w άϦϑ	glyph
ɿਤ‫ͯ͠ͱܗ‬ͷจࣈΛѻ͏୯Ґ
w άϦϑ͸ϕʔεϥΠϯ	baseline
Λ‫ج‬४ʹͯ͠ฒͿ
w ֤άϦϑ͸ҎԼͷσʔλΛ΋ͭɿ
r Ξ΢τϥΠϯɿࢀর఺	reference point
͔Βͷ૬ର࠲ඪͰ‫ه‬࿥͞Εͨด‫ۂ‬ઢ
r ਐߦ෯	advance width
ɿͦͷจࣈͷ഑ஔʹΑͬͯࢀর఺ΛͲΕ͚ͩਐΊΔ͔
Ұൠͷ૊൛ॲཧʹԙ͚Δจࣈͷѻ͍ํ
ϕʔεϥΠϯ
ࢀর఺
άϦϑgͷ
ਐߦ෯
ߴ͞
ਂ͞
͞ΒʹҎԼͰߴ͞ͱਂ͞Λఆٛ͠ɼ
άϦϑ͸Ծ૝తͳlശzΛ΋ͭͱΈͳ͢
w ߴ͞ɿNBY	
ด‫ۂ‬ઢͷ࠷ߴ౸ୡ࠲ඪ

w ਂ͞ɿNBY	
—	ด‫ۂ‬ઢͷ࠷௿౸ୡ࠲ඪ


˞͜Ε͸ීวతͳఆࣜԽͱ·Ͱ͸‫͕͍ͳ͑ݴ‬ɼ
গͳ͘ͱ΋59ͷ૊൛ॲཧ,OVUIͰ͸
࣮࣭తʹ͜Εʹ૬౰͢Δํ๏Λ࠾͓ͬͯΓɼ
45:4'*Ͱ΋౿ऻ
w άϦϑ	glyph
ɿਤ‫ͯ͠ͱܗ‬ͷจࣈΛѻ͏୯Ґ
w άϦϑ͸ϕʔεϥΠϯ	baseline
Λ‫ج‬४ʹͯ͠ฒͿ
w ֤άϦϑ͸ҎԼͷσʔλΛ΋ͭɿ
r Ξ΢τϥΠϯɿࢀর఺	reference point
͔Βͷ૬ର࠲ඪͰ‫ه‬࿥͞Εͨด‫ۂ‬ઢ
r ਐߦ෯	advance width
ɿͦͷจࣈͷ഑ஔʹΑͬͯࢀর఺ΛͲΕ͚ͩਐΊΔ͔
w άϦϑ	glyph
ɿਤ‫ͯ͠ͱܗ‬ͷจࣈΛѻ͏୯Ґ
w άϦϑ͸ϕʔεϥΠϯ	baseline
Λ‫ج‬४ʹͯ͠ฒͿ
w ֤άϦϑ͸ҎԼͷσʔλΛ΋ͭɿ
r Ξ΢τϥΠϯɿࢀর఺	reference point
͔Βͷ૬ର࠲ඪͰ‫ه‬࿥͞Εͨด‫ۂ‬ઢ
r ਐߦ෯	advance width
ɿͦͷจࣈͷ഑ஔʹΑͬͯࢀর఺ΛͲΕ͚ͩਐΊΔ͔
Ұൠͷ૊൛ॲཧʹԙ͚Δจࣈͷѻ͍ํ

ϕʔεϥΠϯ
จࣈ໨ͷ
ࢀর఺
จࣈ໨ͷ
ࢀর఺
άϦϑgͷ
ਐߦ෯
Ξ΢τϥΠϯͱਐߦ෯͚ͩͰ͸ࢧোΛ͖ͨ͢৔߹΋͋ΔͷͰɼ
ಛผͳ૊Έ߹Θͤʹରͯ͠ͷΈద༻͞ΕΔॲཧ͕͋Δ
w ϑΥϯτϑΝΠϧ಺ʹͦͷͨΊͷσʔλ͕֨ೲ͞Ε͍ͯΔ
૊൛ॲཧʹԙ͚ΔจࣈͷఆࣜԽ

߹ࣈ	ligature
ɿ
૬ੑ͕ѱ͍‫ܗ‬ঢ়ͷάϦϑ͕ฒͿͱ͖͸
߹ମͯ͠άϦϑʹ͢Δ
Χʔχϯά	kerning
ɿ
ਐߦ෯ʹै͏ͱࣈ͕ؒෆࣗવʹͳΔ
૊Έ߹ΘͤͰ͸ௐ੔Λߦͳ͏
࣮ࡍʹ૊·Εͨ߹ࣈɾΧʔχϯάͷྫʢσϞ࠶‫ܝ‬ʣ
άϦϑͷlശz͸ਫฏํ޲ʹฒΜͰlߦzΛͳ͢
w ͜ͷlߦzΛΠϯϥΠϯϘοΫεྻͱ‫Ϳݺ‬
lߦz͸ߦ෼ׂॲཧ	line breaking
ʹΑͬͯ੾Γ෼͚ΒΕͯlஈམzʹͳΔ
w ۭനͳͲ͸ద੾ʹ৳ॖ͠ɼߦ௕͕ἧ͏Α͏ʹ੔‫ܗ‬
w lஈམz΋ԣʹࡉ௕͍lശz͕Ԗ௚ํ޲ʹ࿈ͳͬͨ΋ͷͰɼ
ϒϩοΫϘοΫεྻͱ‫Ϳݺ‬
lശzͷ࿈ͳΓͱͯ͠ͷߦ΍ஈམ

ʜ
ʜ
ʜ
ΠϯϥΠϯํ޲
ϒ
ϩ
ỽ
Ϋ
ํ
޲
ΠϯϥΠϯϘοΫεྻΛϓϩάϥϜͰૢ࡞͢Δର৅ͱͯ͠௥Ճɿ
ૢ࡞ର৅ͱͯ͠ͷϘοΫεྻͷఆࣜԽ

v ::= λx . e | ⋯ | ib
ib ::= [ib]*
ib ::=
| | ⋯ | | ⋯
|
⋮
άϦϑ
ۭന
஋
ΠϯϥΠϯ
ϘοΫεྻ
‫ݸ‬Ҏ্ͷ
༗‫ݸݶ‬ͷྻ
ΠϯϥΠϯϘοΫεྻʹ͸ྻશମͰ ͱ͍͏‫ج‬ຊ‫ܕ‬Λ͚ͭΔɿ
ҎԼͷ૊ࠐΈവ਺Ͱ࿈݁Ͱ͖Δɿ
inlineboxes
Γ ⊢ ib : inlineboxes
(++): inlineboxes → inlineboxes → inlineboxes
ϒϩοΫϘοΫεྻ΋ૢ࡞ର৅ͱͯ͠௥Ճɿ
ૢ࡞ର৅ͱͯ͠ͷϘοΫεྻͷఆࣜԽ

v ::= λx . e | ⋯ | bb
bb ::= [bb]*
஋
ϒϩοΫ
ϘοΫεྻ
‫ݸ‬Ҏ্ͷ༗‫ݸݶ‬ͷྻɼ
௚‫ͯ͠ͱ؍‬͸ॎʹ࿈ͳ͍ͬͯΔ
bb ::=
|
|
⋮
ߦͷ಺༰
ߦؒͷۭന
⋯
ϒϩοΫϘοΫεྻʹ͸ྻશମͰ ͱ͍͏‫ج‬ຊ‫ܕ‬Λ͚ͭΔɿ
΍͸Γ૊ࠐΈവ਺Ͱ࿈݁Ͱ͖Δɿ
blockboxes
Γ ⊢ bb : blockboxes
(+++): blockboxes → blockboxes → blockboxes
ҎԼͷΑ͏ͳ૊ࠐΈവ਺line-breakͱͯ͠
ߦ෼ׂॲཧΛఏ‫ͯ͠ڙ‬Ϣʔβ͕࢖༻Ͱ͖ΔͱΑͦ͞͏ɿ
૊ࠐΈവ਺ʹΑΔߦ෼ׂॲཧͷఏ‫ڙ‬

line-break v1 ⋯ vn ʜ
ʜ
ʜ
⏞
ԿΒ͔ͷઃఆ஋ʢߦ௕ͳͲʣ

line-breakͷ‫ܕ‬͸ҎԼͷ‫ܗ‬ɿ
τ1 → ⋯ → τn → inlineboxes → blockboxes
w άϦϑͷͳ͢lശz͕ਫฏʹฒΜͩ΋ͷɿΠϯϥΠϯϘοΫεྻ 
w ࡉ௕͍lߦͷശz͕ॎʹฒΜͩ΋ͷɿϒϩοΫϘοΫεྻ 
w ‫ج‬ຊ‫ܕ‬ͷ௥Ճɿ
w ߦ෼ׂॲཧ͸ҎԼͷ૊ࠐΈവ਺Ͱఏ‫ڙ‬ɿ
ib
bb
͜͜·Ͱͷ·ͱΊ

τ ::= ⋯ | |
inlineboxes blockboxes
line-break: τ1 → ⋯ → τn → inlineboxes → blockboxes
v ::= ⋯
|
|
w ͷྫɿ
w ͷྫɿ
ib
bb
ʜ
ʜ
ʜ
ib
bb
w ։ൃಈ‫ػ‬ɾ໨తҙࣝ
w ಈ࡞σϞ
wจࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
wจॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
w ߦ෼ׂॲཧͷ࢓૊Έ
w ଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w ༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w ·ͱΊ
໨࣍
͜͜·ͰͰϘοΫεྻͷॲཧํ๏ͷେ࿮͸ఆࣜԽͰ͖͕ͨɼ
౰વͳ͕ΒΤϯυϢʔβ͕άϦϑΛ௚઀༩͑ͨΓ͸͠ͳ͍ͷͰɼ
ԿΒ͔ͷϚʔΫΞοϓ͕ࢪ͞ΕͨςΩετ‫ࣜܗ‬ͷ‫͔ߘݪ‬Β
ϘοΫεྻ΁ͱม‫࠷ͯ͠׵‬ऴతʹจॻΛ૊ΊΔΑ͏ͳ࢓૊Έ͕ඞཁ
ͲΜͳ‫هͰࣜܗ‬ड़͢Δ‫͢ʹޠݴ‬Δ͔ʁ
໨తҙ͔ࣝΒͯ͠ҎԼΛຬ͍ͨͯ͠Δ͜ͱ͕؊ཁɿ
w ԿΒ͔ͷํ๏Ͱ੩తʹଥ౰ੑΛ‫͖Ͱࠪݕ‬Δ
w Ϣʔβࣗ਎͕ϚʔΫΞοϓʹ࢖͏ίϚϯυΛ৽‫ʹن‬ఆٛͰ͖Δ
จॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
9.-ʹ͍ۙཁྖͰɼ‫ߘݪ‬Λ%5ʢ୅਺తσʔλ‫ܕ‬ʣͰѻ͏ʁ
ΫϥεϑΝΠϧ͕%5Λఆٛ͢Δ͜ͱͰϚʔΫΞοϓํ๏Λ‫ن‬ఆ͢Δͱɼ
ΫϥεϑΝΠϧΛ࢖͏ΤϯυϢʔβଆͰ͸ϚʔΫΞοϓͷఆٛΛ֦ு͠ʹ͍͘
w ͍ΘΏΔYQSFTTJPOQSPCMFN
w 0QFOEBUBUZQFT-ÖI)JO[F͕͋Ε͹֦ுͰ͖Δ͕ɼ
σʔλΛ࢖͏ଆͷവ਺ͷෳࡶԽ͕ґવආ͚ʹ͍͘
r 0$BNMͰ͍͏type += of 
YQSFTTJPOQSPCMFNͱແԑʹͳΔΑ͏ͳఆࣜԽ͸Ͱ͖ͳ͍͔ʁ
͍ΘΏΔ5BHMFTTpOBMతͳఆࣜԽΛ͢ΔͱΑͦ͞͏
t C τ
%5Ͱ‫ߘݪ‬Λ‫ه‬ड़͢Δʹ͸໰୊͋Γ
‫ߘݪ‬ͷྫʢ࠶‫ܝ‬ʣɿ
‫ݱ‬ঢ়ͷ‫هߘݪ‬ड़ํ๏

+section{SATySFi;ͷ‫}ྫߘݪ‬
+p{
PPLͰ͸emph{2ճ໨ͷൃද}Ͱ͢ɽ
͓ੈ࿩ʹͳΓ·͢ɽ
}

w {ʜ}ɿΠϯϥΠϯςΩετ
w ʜɿϒϩοΫςΩετ
w fooɿΠϯϥΠϯίϚϯυ
r ΠϯϥΠϯςΩετதͷϚʔΫΞοϓ
w +fooɿϒϩοΫίϚϯυ
r ϒϩοΫςΩετதͷϚʔΫΞοϓ
ΠϯϥΠϯςΩετ{ }ͷ‫ࣜܗ‬ɿ
it
it ::= [it]*
it ::= char
| [e]*
จࣈʢʹ6OJDPEFίʔυϙΠϯτʣ
ίϚϯυద༻
foo
·ͣɼίϚϯυద༻͕ͳ͘จࣈྻ͚ͩͷ৔߹ͷม‫׵‬͸؆୯ɿ
‫ݱ‬ঢ়ͷ‫ॲߘݪ‬ཧํ๏ͷఆࣜԽ

{The quick brown fox jumps ʜ }
ʜ
ม‫ʹ׵‬ඞཁͳ෇Ճ৘ใ
w ϑΥϯτϑΝϛϦʔ
w จࣈαΠζ
w จࣈ৭
w ⋮
෇Ճ৘ใ͸ͦΕΒΛશ෦ूΊͨϨίʔυͷΑ͏ͳ஋ͱͯ͠
ϓϩάϥϜ্Ͱѻ͏͜ͱʹ͠ɼ͜ͷ஋ΛςΩετॲཧจ຺ͱ‫Ϳݺ‬
ςΩετॲཧจ຺ͷఆࣜԽ

τ ::= ⋯ | context Γ ⊢ Ctx : context
҆қʹߋ৽Ͱ͖ͯ΄͘͠ͳ͍಺༰΋͋ΔͷͰɼ
ϨίʔυͰ͋Δ͜ͱ͸Ϣʔβ͔Β͸‫ͣ͑ݟ‬ɼ
֤߲໨ͷlHFUUFSzͱlTFUUFSz͕૊ࠐΈവ਺ͱͯ͠ఆٛ͞Ε͍ͯΔɿ
w get-font-size 
r ֨ೲ͞Ε͍ͯΔจࣈαΠζΛऔΓग़͢
w set-font-size 
r ( | set-font-size )ͰจࣈαΠζΛ ʹߋ৽ͨ͠ Λฦ͢
: context → length
: length → context → context
Ctx ℓ ℓ Ctx
v ::= ⋯ | Ctx
Ctx ::= {fontsize = ℓ, …}
௕͞ఆ਺ʢྫɿ12ptʣ
௕͞ͷ‫ܕ‬
ҎԼͷΑ͏ͳ૊ࠐΈവ਺read-inlineͱͯ͠ఏ‫ڙ‬ɿ
ϘοΫεྻ΁ͷม‫׵‬ͷ૊ࠐΈവ਺

read-inline {The quick brown fox jumpsʜ}
Ctx
ʜ

‫ܕ‬͸read-inline: context → inlinetext → inlineboxes
ΠϯϥΠϯςΩετʹͭ͘‫ج‬ຊ‫ܕ‬
ίϚϯυΛద੾ʹఆٛ͢Ε͹ҎԼͷཁྖͰม‫͖Ͱ׵‬ΔΑ͏ʹ͍ͨ͠ɿ
ίϚϯυద༻Λ‫ؚ‬Ή৔߹ʹҰൠԽ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
{The emph{quick brown} fox ʜ }
͜ͷద༻ͷ෦෼ΛʮςΩετॲཧจ຺Λड͚औΔͱ
ΠϯϥΠϯϘοΫεྻʹͳΔ΋ͷʯͱଊ͑Δ
emph{quick brown} ͱΈͳͤΔ
: context → inlineboxes
emph ͱΈͳͤΔ
: inlinetext → context → inlineboxes
emph ͸ҎԼͷΑ͏ʹఆٛͰ͖ͦ͏ɿ
: inlinetext → context → inlineboxes
ίϚϯυఆٛ

let emph (it : inline-text) (ctx : context) =
let ctx = ctx | set-italic-font in
read-inline ctx it
ϑΥϯτΛΠλϦοΫମʹߋ৽͢Δɼ ‫ܕ‬ͷิॿവ਺
context → context
let-inline ctx emph it =
let ctx = ctx | set-italic-font in
read-inline ctx it
࣮ࡍͷ45:4'*Ͱ͸ҎԼͰemphΛఆٛ͢Δɿ
ςΩετॲཧจ຺Λड͚औΔม਺͕
ߏจ্Ͱखલʹདྷ͚ͨͩ
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
The emph{quick brown} foxʜ
Ctx
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
emph{quick brown} foxʜ
Ctx
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
emph{quick brown} foxʜ
Ctx
let-inline ctx emph it =
let ctx = ctx | set-italic-font in
read-inline ctx it
ίϚϯυద༻ͷධՁͷΠϝʔδ
read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
emph{quick brown} foxʜ
Ctx
let-inline ctx emph it =
let ctx = ctx | set-italic-font in
read-inline ctx it
ͷϑΥϯτΛΠλϦοΫʹߋ৽ͨ͠จ຺ ͕ͭ͘ΒΕɼ
ೖΕࢠͰread-inline {quick brown}͕ධՁ͞ΕΔ
Ctx Ctx′
Ctx′
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
emph{quick brown} foxʜ
Ctx
quick brown
Ctx′
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
emph{quick brown} foxʜ
Ctx
brown
Ctx′
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
emph{quick brown} foxʜ
Ctx
Ctx′
foxʜ
ίϚϯυద༻ͷධՁͷΠϝʔδ
read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
Ctx
໭Γ஋͕ίϚϯυద༻ͷ͋ͬͨՕॴʹૠೖ͞ΕΔ
foxʜ
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
Ctx
ʜ
ίϚϯυద༻ͷධՁͷΠϝʔδ

read-inline {The emph{quick brown} foxʜ}
Ctx
 ʜ
ͱ͍͏ධՁͷ్த‫ܦ‬աΛ‫ͯݟ‬ΈΔ
Ctx
emph͸࣮ࡍͷ45:4'*Ͱ͸ ‫͚͕ͭܕ‬ΒΕΔ
w લड़ͷ௨Γҙຯ࿦తʹ͸ ‫ܕ‬ͷവ਺
[inlinetext] inlinecmd
inlinetext → context → inlineboxes
ίϚϯυͷ‫ܕ‬

let-inline ctx emph it =
let ctx = ctx | set-italic-font in
read-inline ctx it
ΑΓҰൠʹɼ ‫ܕ‬ͷҾ਺ΛͱΔ Ҿ਺ͷίϚϯυ͸
‫͚͕ͭܕ‬ΒΕΔ
w ҙຯ࿦తʹ͸ ‫ܕ‬ͷവ਺
w ͜ͷ‫ʹ͚ͭܕ‬ΑΓɼ‫ߘݪ‬Λॻ͘ࡍ͸ςΩετॲཧจ຺Λҙࣝ͢Δඞཁ͕ͳ͘ͳΔ
τ1, …, τn n
[τ1; …; τn] inlinecmd
τ1 → ⋯ → τn → context → inlineboxes
ϒϩοΫίϚϯυ΋ಉ༷ʹ ‫ܕ‬ͷ
വ਺ͱΈͳͤͯɼ ‫ܕ‬Λ͚ͭͯѻ͏
ஈམΛ૊ΉίϚϯυ+p͸ҎԼͷ‫Ͱܗ‬ఆٛͰ͖ɼ ‫ܕ‬
τ1 → ⋯ → τn → context → blockboxes
[τ1; …; τn] blockcmd
[inlinetext] blockcmd
ϒϩοΫςΩετͷ৔߹

let-block ctx +p it = ʜ
ʢ+pͷ࣮૷ํ๏͸࣍અͰ‫ޙ‬ड़ʣ
ϒϩοΫςΩετ ͷཁૉ͸ίϚϯυద༻ͷΈɿ
bt
bt ::= [bt]* bt ::= [e]*
+foo
read-block: context → blocktext → blockboxes
w ΠϯϥΠϯςΩετɼϒϩοΫςΩετɼςΩετॲཧจ຺Λ௥Ճɿ
w ૊ࠐΈവ਺
r line-break 
r read-inline 
r read-block 
r ςΩετॲཧจ຺ͷHFUUFSͱTFUUFS
w get-font-size
: τ1 → ⋯ → τn → inlinetext → inlineboxes
: context → inlinetext → inlineboxes
: context → inlinetext → inlineboxes
: context → length
͜͜·Ͱͷ·ͱΊ

τ ::= ⋯ | inlineboxes | blockboxes | |
| | | |
inlinetext blocktext
context [[τ]*] inlinecmd [[τ]*] blockcmd
length
v ::= ⋯ | ib | bb | | |
 
bt
{ }
it Ctx
it ::= [it]* it ::= char | [e]*
bt ::= [bt]* bt ::= [e]*
foo
+foo
͜͜·Ͱͷ·ͱΊ

ΠϯϥΠϯ ϒϩοΫ
Ϙ
ỽ
Ϋ
ε
ྻ
ς
Ω
ε
τ
 +p{
The quick
brown fox ʜ
} 
ʜ
ʜ
ʜ
{The quick brown fox jumps ʜ }
read-inline read-block
line-break
w ։ൃಈ‫ػ‬ɾ໨తҙࣝ
w ಈ࡞σϞ
wจࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
wจॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
wߦ෼ׂॲཧͷ࢓૊Έ
w ଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w ༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w ·ͱΊ
໨࣍
࣮ࡍͷߦ෼ׂॲཧͷ૊ࠐΈവ਺
line-break b1 b2 Ctx ʜ
ʜ
ʜ

line-break 
w ɼ ɿͭͷਅِ஋
r ߦ෼ׂॲཧࣗମͱؔΘΔઃఆ஋Ͱ͸ͳ͍ͷͰࠓճ͸৮Εͳ͍
w ɿςΩετॲཧจ຺
r ߦ௕ͳͲɼߦ෼ׂॲཧʹඞཁͳઃఆ஋͸͔͜͜ΒऔΓग़ͯ͠࢖͏
: bool → bool → context → inlineboxes → blockboxes
b1 b2
Ctx
45:4'*ͷߦ෼ׂॲཧͰ͸ɼ59ͷͨΊʹఏҊ͞Εͨ
,OVUIr1MBTTΞϧΰϦζϜ,OVUI1MBTTͷఆࣜԽΛ౿ऻ
w ଟগͷಠ֦ࣗு͋Γ
ߦ෼ׂॲཧͷ࢓૊Έ

ߦ෼ׂॲཧ໰୊
w ೖྗɿΠϯϥΠϯϘοΫεྻ ɼॴ๬ͷߦ௕ 
r ଞͷύϥϝʔλ͸ᘭ຤ͳͷͰࠓճ͸ࣺ৅͢Δ
w ग़ྗɿ ΛۭനΛద੾ʹ৳ॖ͢ΔͳͲ֤ͯ͠ߦͷ௕͕͞ ʹͳΔΑ͏ʹ
੾Γ෼͚ͯͰ͖ΔϒϩοΫϘοΫεྻͷ͏ͪ࠷΋‫ݟ‬ө͑ͷྑ͍΋ͷ
r ‫ݟ‬ө͑ͷྑ͞͸ԿΒ͔ͷධՁํ๏Ͱద੾ʹఆٛ͢Δඞཁ͋Γ
ib ℓ
ib ℓ
˞lલ͔Βॱʹ٧Ί͍͖ͯɼᷓΕͨΒͦ͜Ͱߦ෼ׂzͱ͍͏ᩦཉ๏Ͱ͸
Ұൠʹ͸࠷ྑͷ݁Ռʹ͸ͳΒͳ͍
ߦ෼ׂॲཧ໰୊ΛॏΈ͖ͭ༗޲ඇ८ճάϥϑ্ͷ࠷୹‫ܦ‬࿏໰୊ʹ‫ؼ‬ண͢Δ
಺༰ ͱߦ௕ࢦఆ ͔Β Λߏ੒
w ௖఺ू߹ 
r ໛ࣜਤɿ
w ลʢ ಺Ͱ ͸ ΑΓ΋खલͷ఺ʣ
r l Ͱߦ෼ׂͯͦ͠ͷ࣍ʹ Ͱߦ෼ׂͨ͠ͱ͖ɼ ͱ ͷؒͷ಺༰Λ
௕͕͞ ʹͳΔΑ͏ʹߦͱͯ͠૊Ήͱɼͦͷ‫ݟ‬ө͑ͷධՁ͸ z
w ͸େ͖͍΄Ͳ‫ݟ‬ө͕͑ѱ͍͜ͱΛද͢ϖφϧςΟ஋ʢܾఆํ๏͸࣍ทͰઆ໌ʣ
ͷʮઌ಄ʯ͔Βʮ຤ඌʯ΁ࢸΔ࠷୹‫ܦ‬࿏Λ‫ٻ‬ΊΔͱɼͦΕ͕௨Δ֤௖఺͕
ϖφϧςΟ૯࿨Λ࠷খԽ͢Δʢʹ࠷΋‫ݟ‬ө͑ͷྑ͘ͳΔʣ੾Γ෼͚Օॴ
ib ℓ G = (V, E; d)
V := ( ib தͷߦ෼ׂՄೳͳՕॴશମ ) ⊎ {ઌ಄, ຤ඌ}
ib v v′
v v′ v v′
ℓ p
p
G
,OVUIr1MBTTΞϧΰϦζϜ

v v′
p
ʜ
v1 v2 v3 v4 v5
ઌ಄ ຤ඌ
,OVUI
1MBTT
ߦ෼ׂީิՕॴ ͱͦͷ࣍ͷީิՕॴ ΛܾΊͨΒɼۭനΛ৳ॖͯ͠
ͱ ͷؒͷ಺༰͕௕͞ ʹͳΔΑ͏ʹ͠ɼͦͷ‫ݟ‬ө͑ΛධՁ
v v′
v v′ ℓ
ߦͷ‫ݟ‬ө͑ͷධՁํ๏

ℓ
v v′
‫ݟ‬ө͑ධՁͷͨΊʹɼۭന͸
	ࣗવ௕
৳ͼΔ‫ڐ‬༰ྔ
ॖΉ‫ڐ‬༰ྔ

ͱ͍͏ͭͷύϥϝʔλΛ͍࣋ͬͯΔ
w όωͷΑ͏ͳΠϝʔδ
w ࣗવ௕ʹ͍ۙ΄Ͳ‫ݟ‬ө͕͑ྑ͍
͜ͱΛද͢ɼԼʹತͳධՁവ਺Λ΋ͭ ࣗ
વ
௕
࠷΋
ृѱ
࠷ྑ
ϖ
φ
ϧ
ς
ỹ
஋
࠷
୹
࠷
௕
,OVUI1MBTT
࣮ࡍͷߦ෼ׂՄೳՕॴ͸୯‫ؒޠ‬ͷۭന͚ͩͱ͸‫ݶ‬Βͣɼ
΋͏গ͠ҰൠԽ͞Εͨ࢓૊Έʹͳ͍ͬͯΔ

ҰൠԽ͞Εͨߦ෼ׂՄೳՕॴͷࢦఆํ๏
ib ::= [ib]*
{
ib0
ib1 / ib2}
p
l͜͜Ͱߦ෼ׂ͢Δ͔͠ͳ͍͔બ΂Δɽ
ߦ෼ׂ͠ͳ͍ͳΒ ͱ౳ՁͰ͋Γɼ
Ұํ͜͜Ͱߦ෼ׂ͢ΔͳΒखલͷߦ຤ʹ Λɼ
‫ํޙ‬ͷߦ಄ʹ ΛͦΕͧΕ݁߹͠ɼ͔ͭ
෼ׂͦͷ΋ͷʹΑΓϖφϧςΟ ͕ੜ͡Δz
ib0
ib1
ib2
p
ɿ
{ε / ε}
100
୯‫ؒޠ‬ͷۭന͸ͱද‫͞ݱ‬ΕΔ
ib ::= | ⋯ | | ⋯
|
|
{
ib
ib / ib}
p
άϦϑ
৳ॖ͢Δۭന
EJTDSFUJPOBSZCSFBL
⋮
 ɿۭྻ
ε
EJTDSFUJPOBSZCSFBLͷ࢓૊ΈʹΑΓ༷ʑͳߦ෼ׂํ๏͕ද‫͖Ͱݱ‬Δɿ
w ϋΠϑωʔγϣϯʹΑΔ୯‫ޠ‬தͰͷߦ෼ׂɿ
r ୯‫ޠ‬தͷҰ෦Օॴ͸ߦ෼ׂͯ͠Α͘ɼ෼ׂ࣌͸खલͷߦ຤ʹϋΠϑϯ͕ೖΔ
w ྫɿlUBCMFz͸lUBCMFzͱ෼ׂͯ͠Α͍ͷͰ্ਤͷΑ͏ʹѻ͏
w ӳ‫ͱͩޠ‬෼ׂͯ͠Α͍Օॴ͸୯‫͍ͯͬ·ܾʹͱ͝ޠ‬Δ͕ɼ۪௚ʹදҾ͖ͤͣͱ΋
-JBOHr,OVUIΞϧΰϦζϜ-JBOHͱ͍͏ਪఆํ๏͕࢖͑Δ
r ϋΠϑωʔγϣϯ͸୯‫Ͱؒޠ‬ͷ෼ׂΑΓ΋޷·͘͠ͳ͍ͱ͍͏͜ͱΛ൓ө͠ɼ
ϖφϧςΟΛߴΊʹઃఆ
r ࣮ࡍ͸୯‫ޠ‬தͰ෼ׂ͢Δ͔͠ͳ͍͔Ͱ߹ࣈʹ͢Δ͔΍Χʔχϯά͢Δ͔͕
มΘΓ͏ΔͷͰ΋͏গ͠ෳࡶͳ࢓૊Έ
%JTDSFUJPOBSZCSFBLʹΑΔछʑͷߦ෼ׂͷද‫ݱ‬

{
ε
/ ε}
1000
w ࿨จ૊൛
r ҎԼͷΑ͏ͳ‫ن‬ଇʹ͓͓Αͦ४‫ڌ‬
w ʰ೔ຊ‫ޠ‬૊൛ॲཧͷཁ݅ʱɼ௨শ+-SFR8$೔ຊ‫ޠ‬૊൛λεΫϑΥʔε
w 6OJDPEF-JOF#SFBLJOHMHPSJUIN6OJDPEF$POTPSUJVN
r େ఍ͷจࣈؒ͸ߦ෼ׂͯ͠Α͍
w ‫ݪ‬ଇͱ֤ͯ͠จࣈؒʹࣗવ௕ͷۭനΛ΋ͭEJTDSFUJPOBSZCSFBL͕ೖΔ
r ͨͩ͠ɼߦ಄ߦ຤‫ې‬ଇ͸͋Δ
w ߦ಄ෆՄͷจࣈɿด͡‫ހׅ‬ɼ۟ಡ఺ɼʮΌʯɼʮʔʯͳͲ
w ߦ຤ෆՄͷจࣈɿ։͖‫Ͳͳހׅ‬
%JTDSFUJPOBSZCSFBLʹΑΔछʑͷߦ෼ׂͷද‫ݱ‬

{ε / ε}
100
{ε / ε}
100
{ε / ε}
100
{ε / ε}
100
{ε / ε}
100
r ߦ಄ͷ։͖‫ހׅ‬ͷ௚લ΍ɼߦ຤ͷด͡‫ހׅ‬΍۟ಡ఺ͷ௚‫ޙ‬͸ɼ
ߦதͱ͸ҟͳΓೋ෼ΞΩʢʹ͍ΘΏΔ൒֯෯ͷۭനʣΛೖΕͳ͍
w ֘౰Օॴ͸ࣗવ௕͕ೋ෼ΞΩͷۭനΛ΋ͭEJTDSFUJPOBSZCSFBLʹͳΔ
%JTDSFUJPOBSZCSFBLʹΑΔछʑͷߦ෼ׂͷද‫ݱ‬

{ε / ε}
100
{ε / ε}
100
{ε / ε}
100
{ε / ε}
100
{ε / ε}
100
ߦ෼ׂॲཧͷར༻ྫ

ஈམΛ૊ΉίϚϯυ+p ͸
૊ࠐΈവ਺line-breakΛ༻͍࣮ͯ૷ɿ
ଞͷ૊ࠐΈവ਺ɿ
w inline-skip 
r ࢦఆͨ͠௕͞ͷ৳ॖͰ͖ͳ͍ۭനΛฦ͢
r ͜͜Ͱ͸ஈམ๯಄ͷࣈԼ͛ʹ࢖༻
w inline-fil 
r ࣗવ௕͕Ͱɼ͔ͭϖφϧςΟͳ͘Ͳ͜·Ͱ΋৳ͼΒΕΔಛघͳۭന
r ͜͜Ͱ͸ʮஈམ࠷ऴߦ͸ߦ຤·Ͱ౸ୡ͠ͳͯ͘Α͍ʯ͜ͱͷ࣮‫༻࢖ʹݱ‬
: [inlinetext] blockcmd
: length → inlineboxes
: inlineboxes
let-block ctx +p it =
let ib = read-inline ctx it in
let indent = inline-skip (get-font-size ctx) in
line-break true true ctx (indent ++ ib ++ inline-fil)
ʜ
indent
inline-fil
ib
w ։ൃಈ‫ػ‬ɾ໨తҙࣝ
w ಈ࡞σϞ
wจࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
wจॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
wߦ෼ׂॲཧͷ࢓૊Έ
wଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w ༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w ·ͱΊ
໨࣍
w ੩తʹ‫Ͱ͔͓͕͛ͭ͘ܕ‬ਝ଎Ͱଟ͘ͷ৔߹਌੾ͳΤϥʔใࠂ͕ߦͳΘΕɼ
҃Δఔ౓࢖͍΍͍͢΋ͷʹͳͬͨ
r ͱΓΘ͚ύοέʔδͷ࣮૷ʹ͸ͳ͔ͳ͔ҖྗΛൃ‫ش‬
w 59-
59ͱ45:4'*྆ํͰ೤৺ʹύοέʔδΛॻ͔ΕΔํʹ
ʢ59ͱൺ΂ͯʣ
ʮϓϩάϥϛϯά‫ͯ͠ͱޠݴ‬͸໌Β͔ʹָʯͱ͍͏‫ײ‬૝Λ໯͑ͨ
w ҰํͰɼ‫͚ͭܕ‬ͷ౎߹্Ͳ͏ͯ͠΋‫ߘݪ‬ͷ‫ه‬ड़͕൥ࡶʹͳͬͯ͠·͏
৔໘͕ग़ͯ͘Δ
r ಛʹจॻ࡞੒ͷ༻్Ͱ͸ʢ൚༻ͷ‫ޠݴػࢉܭ‬Ҏ্ʹʣ
ෳࡶͳσʔλ΋؆ܿʹ‫ه‬ड़Ͱ͖Δ͜ͱΛ๬·Ε͕ͪ
จॻ‫ه‬ड़্ͷߋͳΔ໰୊ҙࣝ
‫಺ޠݴ‬%4-ͷಋೖ
w จࣈྻΛड͚औͬͯߏจղੳ͢ΔΑ͏ʹίϚϯυΛఆٛ͢Δ
w ؆୯ͳྫɿ͋Έͩ͘͡ͷ‫ه‬ड़ΛΞεΩʔΞʔτͰͰ͖ΔΑ͏ʹ͢Δ
‫ه‬ड़ෳࡶԽʹର͢ΔφΠʔϰͳճආࡦ

amidakuji(```
|X|-|=|/| |
| |-||-|X|
|=|X|-||=|
|-||-|=|-|
|X|=|-|| |
```);
amidakuji([
[Cross; Line; ʜ ];
[Empty; Line; ʜ ];
[Double; Cross; ʜ ];
ʜ
]);
௨
ৗ
ͷ
࣮
૷
̙
̨
̡
ํ
ࣜ
%4-ͷղऍ͸ಈతʹʢʹ૊൛ॲཧ։࢝‫ʹޙ‬ʣߦͳΘΕΔͨΊɼ
Τϥʔ͕͋ͬͨ৔߹ʹൃ‫͕ݟ‬஗͍
w %4-Λ࢖͚ͬͨͩͰಈతʹΤϥʔ͕ग़Δੈքʹ‫ٯ‬໭Γ
%4-ͷղऍ͸૊൛ॲཧʹґଘ͢Δ͜ͱͳ͘ՄೳͳͷͰɼ
‫ޠݴ‬ຊମʹϚΫϩ‫ߏػ‬Λಋೖͯ͠લॲཧͰ͖ΔΑ͏ʹ͢Ε͹Α͍
͔҆͠͠қʹϚΫϩ‫ߏػ‬ΛೖΕΔͱࠓ౓͸Τϥʔ͕ෆ਌੾ʹͳΓ΍͍͢ͷͰɼ
Ͱ͖Δ͚ͩ‫ݪ‬ҼͷΘ͔Γ΍͍͢Τϥʔ͕ग़Δ࢓૊Έʹ͍ͨ͠
ଟஈ֊‫	ࢉܭ‬multi-stage programming
ʹ‫ͮ͘ج‬ϚΫϩ‫ߏػ‬Λಋೖ͠Α͏
φΠʔϰͳճආࡦͷ໰୊఺ͱͦͷղܾࡦ
w ಈతʹίʔυΛੜ੒ͯ͠ߋʹͦΕΛ࣮ߦ͢ΔΑ͏ͳ‫ߏػ‬Λඋ͑ͨɼ
‫͕ࢉܭ‬ෳ਺ͷεςʔδ	stage
͔ΒͳΔମ‫ܥ‬
ʴͦͷΑ͏ͳૢ࡞Λ҆શʹߦͳ͏ͨΊͷ‫ܕ‬γεςϜ
w ྫɿ.FUB.-5BIB4IFBSEɼЕ˓%BWJFTɼ
.FUB0$BNM,JTFMZPWɼଞଟ਺
w ಛʹεςʔδͷ৔߹ɿ
w ৄࡉ͸໌೔ʂɿ
ଟஈ֊‫ͱࢉܭ‬͸

ୈεςʔδʢʹlલॲཧzʣ
ୈεςʔδʢʹl௨ৗͷධՁzʣ
εςʔδͷ.FUB.-5BIB4IFBSEΛϕʔεʹͨ͠
.BDSP.-(BO[
4BCSZ5BIBʹ͍ۙϚΫϩ‫ߏػ‬ͷఆࣜԽΛ࠾༻
w ϚΫϩͷ࢖༻ྫɿ
r ~(ʜ)͸ϚΫϩల։தʹ࢖ΘΕΔୈεςʔδͷ஋ͷҾ਺
r ~ͳ͠ͷҾ਺͸ల։‫ޙ‬ͷίʔυͷҰ෦ͱͳΔ
w ϚΫϩͷఆٛࣗମ͕ల։ΑΓલʹ‫ࠪ͞ݕܕ‬Εɼ‫͚͕ͭܕ‬͹
ల։݁Ռ͸ඞͣXFMMUZQFE
w య‫ܕ‬తʹ͸ϚΫϩల։ʢʹίʔυੜ੒ʣ͸ҰॠͰऴΘΔͷͰɼ
ϚΫϩల։தʹQBOJD͢Ε͹lࣄ্࣮੩తʹzΤϥʔ͕ใࠂ͞ΕΔ
ϚΫϩ‫ߏػ‬ͷ‫ޠݴ‬ઃ‫ܭ‬

repeat@~(3){foo{A}}
% ௨ৗͷධՁ͕࢝·ΔλΠϛϯάͰ͸ɼ࠷ॳ͔Β
% foo{A}foo{A}foo{A} ͱॻ͍ͯ͋ͬͨͷͱಉ͡ѻ͍ʹͳΔ
‫ࠪݕܕ‬ ϚΫϩల։
௨ৗͷධՁ
ୈεςʔδͷҾ਺ͱͯ͠%4-Λ‫ه‬ड़͢Δɿ
w ϚΫϩల։࣌ʹ%4-Λॲཧ͠ɼߏจΤϥʔ͕͋Ε͹QBOJD͢Δ
r Τϥʔ͸lࣄ্࣮੩తʹzʹग़Δ
r %4-ίʔυதͷͲ͕͜‫ݪ‬ҼͰΤϥʔ͕‫͔͖ͨى‬ΛϚΫϩ಺͔Β
Θ͔Γ΍͘͢ใࠂͰ͖ΔΑ͏ʹɼઌ಄Ґஔ͕ͲͷϑΝΠϧͷԿߦ໨͔
ࣗಈͰิΘΕΔจࣈྻϦςϥϧ@`ʜ`Λ࢖͏
w ਖ਼ৗʹల։͞Εͨ৔߹ɼ݁ՌͷςΩετ͸ධՁ࣌ʹ௨ৗͲ͓Γॲཧ
ϚΫϩ‫ʹߏػ‬ΑΔ%4-ॲཧ

amidakuji@~(@```
|X|-|=|/| |
| |-||-|X|
|=|X|-||=|
|-||-|=|-|
|X|=|-|| |
```);
amidakuji([
[Cross; Line; ʜ ];
[Empty; Line; ʜ ];
[Double; Cross; ʜ ];
ʜ
]);
ల։
ϚΫϩ‫ߏػ‬ͷಈ࡞σϞɿਖ਼ৗ‫ܥ‬

ʢσϞө૾ɿhttps://drive.google.com/file/d/
1l9HeT6Hn_lNn0ptVobVDYwW6T9A8xKvZ/view?usp=sharingʣ
ϚΫϩ‫ߏػ‬ͷಈ࡞σϞɿҟৗ‫ܥ‬

ʢσϞө૾ɿhttps://drive.google.com/file/d/
1pbTOSWiflEkTghS3TzlerG5NCcb2iIoI/view?usp=sharingʣ
w ։ൃಈ‫ػ‬ɾ໨తҙࣝ
w ಈ࡞σϞ
wจࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
wจॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
wߦ෼ׂॲཧͷ࢓૊Έ
wଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w ·ͱΊ
໨࣍
͋Γ͕͍ͨ͜ͱʹ༗ࢤͷํʑʹΑͬͯ
छʑͷपลπʔϧ΍ύοέʔδͷ։ൃ͕ਐߦத
• 45:4'*༻ύοέʔδϚωʔδϟ4BUZSPHSBQIPT4BLBNPUP
– github.com/na4zagin3/satyrographos
– 0$BNMͷύοέʔδϚωʔδϟͰ͋Δ01.ͱซ༻͢Δઃ‫ܭ‬
– ϑΥϯτ΍ઃఆϑΝΠϧ΋؅ཧՄೳ
• ొ࿥͞Ε͍ͯΔύοέʔδҰཡ͕‫ݟ‬ΒΕΔϖʔδ.BUTVOBHB
– satyrographos-packages.netlify.app
– ‫ࡏݱ‬໿ 50 ύοέʔδ
• TBUZTGJCBTF/JTIJXBLJ
.VSBTF,BOFLP
– github.com/nyuichi/satysfi-base
– ඪ४ϥΠϒϥϦͷେ෯֦ॆ
– ύʔαίϯϏωʔλͳͲ΋༻ҙ͞Ε͍ͯΔ
༗ࢤͷํʑʹΑΔπʔϧɾύοέʔδ
• FBTZUBCMFmonaqa github.com/monaqa/satysfi-easytable
– ද૊ΈΛ؆ܿʹ࣮‫͢ݱ‬ΔͨΊͷύοέʔδ
• NBUSJYDECF github.com/abenori/satysfi-matrixcd
– -
59ͷUJL[DEͷΑ͏ʹՄ‫׵‬ਤࣜΛඳͨ͘Ίͷύοέʔδ
• NBLFMBUFY,BOFLP github.com/puripuri2100/SATySFi-make-latex
– ςΩετग़ྗϞʔυʹΑΓɼ45:4'*ιʔεΛ-
59ιʔεʹม‫ͯ͠׵‬
ग़ྗ͢ΔͨΊͷύοέʔδ
• ‫ޠݴ‬ଆͰѻ͑ͳ͍͜ͱʹΑΓ਺ࣜ͸ະରԠ
• 4UFBNFS*TIJJɼ4-Z%*'Jmonaqa
– github.com/konn/satysfi-steamer
– github.com/monaqa/slydifi
– ͍ͣΕ΋εϥΠυ࡞੒༻ͷΫϥεϑΝΠϧ
ଞʹ΋਺ଟ͘ͷπʔϧ΍ύοέʔδ͕ެ։͞Ε͍ͯ·͢
༗ࢤͷํʑʹΑΔπʔϧɾύοέʔδ
એ఻

#൑ϖʔδ
ແঈެ։தɿ
https://booth.pm/
ja/items/1127224
satysfi book ‫ࡧݕ‬
ҎԼͷํʑʹਂ͘‫ँײ‬ਃ্͛͠·͢ɿ
w ։ൃΛࢧԉ௖͍ͨօ༷
r ೥౓*1ະ౿*5ਓࡐൃ۷ɾҭ੒ࣄ‫ۀ‬
r ‫ࣜג‬ձࣾυϫϯΰʢΞϧόΠτͱͯ͠ʣ
r 5IF45:4'*CPPLΛ͝ߪೖ௖͍ͨօ༷
w ೤৺ʹ1VMM3FRVFTU΍ॿ‫ݴ‬ΛԼͬͨ͞։ൃऀͷօ༷
r %BJLJ.BUTVOBHB	matsud224
͞Μɼ%BJDIJ0PIBTIJ	leque
͞Μɼ
/PSJBLJ4BLBNPUP	na4zagin3
͞Μɼ5BLVNB*TIJLBXB	nekketsuuu
͞Μɼ
elpinal͞Μɼ.BTBLJ)BSB	qnighy
͞Μɼsakas--͞Μɼଞଟ਺໊
w ύοέʔδɾपลπʔϧ։ൃऀͷօ༷
w 45:4'*4MBDLɾ45:4'*$POG౳ɼίϛϡχςΟΛӡӦͯ͠Լ͞Δօ༷
r /BPLJ,BOFLP	puripuri2100
͞Μɼmonaqa͞Μɼଞଟ਺໊
ँࣙ
w ։ൃಈ‫ػ‬ɾ໨తҙࣝ
w ಈ࡞σϞ
wจࣈ૊൛ͷఆࣜԽͱͦͷ‫͚ͭܕ‬
wจॻͷϚʔΫΞοϓํ๏ͷఆࣜԽ
wߦ෼ׂॲཧͷ࢓૊Έ
wଟஈ֊‫ࢉܭ‬ϕʔεͷϚΫϩ‫ʹߏػ‬ΑΔ%4-
w ༗ࢤͷํʑʹΑΔपลπʔϧɾύοέʔδ
w·ͱΊ
໨࣍
വ਺‫ܕ‬ͷ‫ޠݴ‬ઃ‫ܭ‬Λϕʔεͱ͢Δɼ
੩త‫͖ͭܕ‬ͷ૊൛ॲཧγεςϜ45:4'*ʹ͍ͭͯ঺հ͠·ͨ͠
w ҙຯ࿦্ͷओͳಛ௃ɿ
r ϘοΫεྻʹΑΔάϦϑͳͲͷऔΓѻ͍
r ςΩετͱจ຺ΛϘοΫεྻʹม‫͢׵‬Δവ਺ͱͯ͠ͷίϚϯυ
r छʑͷ૊ࠐΈവ਺Ͱ੍‫͖Ͱޚ‬Δߦ෼ׂॲཧ
r ‫಺ޠݴ‬%4-Λ࢖༻ͯ͠΋ΤϥʔใࠂΛਝ଎͔ͭ໌շʹอͭͨΊͷɼ
ଟஈ֊‫ͮ͘جʹࢉܭ‬ϚΫϩ‫ߏػ‬
w ͋Γ͕͍ͨ͜ͱʹ༗ࢤͷํʑʹΑΓपลπʔϧ΍ύοέʔδ΋
ਫ਼ྗతʹ։ൃ͞Ε͍ͯΔ
·ͱΊ
• Rowan Davies. A temporal-logic approach to binding-time analysis. In Proc. of LICS’96, pp. 184–195, 1996.
• Sebastian Erdweg and Klaus Ostermann. Featherweight TeX and parser correctness. In SLE 2010. LNCS,
vol. 6563, pp. 397–416, 2011.
• Steve Ganz, Amr Sabry, and Walid Taha. Macros as multi-stage computations: type-safe, generative,
binding macros in MacroML. In Proc. of ICFP’01, pages 74–85, 2001.
• Benedict Gaster and Mark Jones. A polymorphic type system for extensible records and variants, 1996.
• Oleg Kiselyov. The design and implementation of BER MetaOCaml. In Functional and Logic Programming.
FLOPS 2014. Lecture Notes in Computer Science, vol 8475, 2014.
• Donald Knuth and Michael Plass. Breaking paragraphs into lines. So︎ftware–Practice and Experience, 11,
pages 1119–1184, 1981.
• Franklin Liang. Word Hy-phen-a-tion by Com-put-er. Ph. D. thesis, Stanford University, 1983.
• Andres Löh and Ralf Hinze. Open data types and open functions. In Proc. of PPDP’06, pp. 133–144, 2006.
• Atsushi Ohori. A polymorphic record calculus and its compilation. In ACM Transactions on Programming
Languages and Systems, 17(6), pages 844–895, 1995.
• Didier Rémy. Type inference for records in a natural extension of ML. Theoretical Aspects of Object-
Oriented Programming. Types, Semantics and Language Design, pages 67–95, 1993.
• Walid Taha and Tim Sheard. Multi-stage programming with explicit annotations. Theoretical Computer
Science, 248 (1-2), pp. 211–242, 2000.
• Unicode Consortium. Unicode Standard Annex #14: Unicode Line Breaki︎ng Algorithm (Unicode 10.0.0).
http://unicode.org/reports/tr14/, 2017.
• W3C ೔ຊ‫ޠ‬૊൛λεΫϑΥʔεʰW3C ٕज़ϊʔτ ೔ຊ‫ޠ‬૊൛ॲཧͷཁ݅ʱ౦‫ػిژ‬େֶग़൛‫ہ‬, 2012.
ࢀߟจ‫ݙ‬

PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介