Skip to content

Instantly share code, notes, and snippets.

@hsjoihs
Last active February 11, 2018 00:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hsjoihs/a6a49224a98dd619a2c35d764a0abd1e to your computer and use it in GitHub Desktop.
Save hsjoihs/a6a49224a98dd619a2c35d764a0abd1e to your computer and use it in GitHub Desktop.
SATySFiの行送りのバグっぽいもの。ソースコードは https://github.com/gfngfn/SATySFi/tree/master/demo を改変。
@require: stdjabook
@require: code
@require: itemize
@require: tabular
@require: math
@import: local
document (|
title = {Buggy?};
author = {hsjoihs};
show-title = true;
show-toc = false;
|) '<
+section{}<
+p{
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
}
+listing{
* alpha
* beta
* gamma
}
+pn{
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
}
+display-boxes('<
+math-list[
${F = G \frac{M m}{R^2}};
${\limto{N}{\infty} \sums{n = 1}{N} \frac{1}{n^2}
= \frac{\pi^2}{6}};
${\paren{\paren{\paren{A} + B} + C}};
${\brace{\brace{\brace{A} + B} + C}}
];
>)(```
+math-list[
${F = G \frac{M m}{R^2}};
${\limto{N}{\infty} \sums{n = 1}{N} \frac{1}{n^2}
= \frac{\pi^2}{6}};
${\paren{\paren{\paren{A} + B} + C}};
${\brace{\brace{\brace{A} + B} + C}}
];
```);
>
+section{}<
>
+section{}<
+p{
\SATySFi;は,2017年度IPA未踏事業のひとつとして開発された,新しい組版処理システムである。
一口に組版処理システムといっても,大きく分けて
}
+listing{
* GUIの画面上に版面がプレヴューされた状態で文書を視覚的に記述していくWYISIWYGエディタ方式
* によってテキストファイルとして文書を記述し,
言語処理系に入力として与えて最終的にPDFなどの形式で版面を出力する方式
}
+pn{
の2つがあるが,\SATySFi;は後者にあたる。すなわち,\LaTeX;やtroffなどと同様の形式をとるソフトウェアだ。
では\LaTeX;をはじめとする既存のマークアップ言語方式と\SATySFi;との違いは何なのだろうか?
}
+listing{
* コマンド定義を記述したコードの可読性が高くカスタマイズしやすい
* ユーザが不適格な入力を与えたときのエラー報告がすばやく,わかりやすく提示される
}
+pn{
といった点にある。
}
+p{
“マークアップ言語方式とWYSIWYG方式とのいずれが優れているのか” といった話題は
(少なくとも一方に触れる人が多いためか)頻繁に目にし,もはや大喜利の様相を呈しているが,
実際にはそれぞれの方式に利点と弱点のトレードオフがあるといってよい。
WYSIWYG方式に比べたマークアップ言語方式一般の利点としては,あくまでも傾向ではあるが
}
+listing{
* 入力がテキストファイルなので差分管理が簡単
* ユーザ定義コマンドにより:
** 複雑な自動処理が実現できる
** 文書の内容を変更せずに後から体裁を柔軟に変更しやすい
}
+pn{
といったことが挙げられるだろう。一方で明白な弱点としては,
}
+listing{
* 任意のテキストが入力として渡せるため,ユーザが意図しないコードを入力として与えやすい
}
+pn{
というものがある。ユーザが意図していない入力のうち処理系にとっては適格なコードは
間違いを検出することが(少なくとも非統計的な手法では)原理的にできないし,
これはユーザ自身が出力された版面を見て確かめるしかないが,
処理系にとっても不適格なコード,すなわちコマンドの引数の与え方がおかしいといったミスは,
処理系が見つけて報告することができる。
\emph{ここのページ送りは問題なさそう}
つまり,ユーザが意図しないコードを与えてしまいやすいという弱点が本質的にあるマークアップ言語という方式では,
処理系にとって不適格なコードが入力として渡された場合にどのようなエラー報告を行なうかが
ユーザの執筆効率に多大な影響をもたらすと考えてよいだろう。
}
>
>
@require: stdjabook
@require: hdecoset
@require: vdecoset
@require: code
let-inline ctx \gray inner =
let pads-code = (2pt, 2pt, 2pt, 2pt) in
let decoset-code = HDecoSet.rectangle-round-fill 4pt 2pt (Color.gray 0.9) in
let ib-frame = inline-frame-breakable pads-code decoset-code (read-inline ctx inner) in
script-guard Latin ib-frame
let-inline ctx \dfn word =
let ctx-dfn =
ctx |> StdJaBook.set-latin-font StdJaBook.font-latin-sans
|> StdJaBook.set-cjk-font StdJaBook.font-cjk-gothic
|> set-text-color (RGB(0.8, 0., 0.))
in
read-inline ctx-dfn word
let-inline ctx \file filename =
let ctx-file =
ctx |> StdJaBook.set-latin-font StdJaBook.font-latin-mono
in
script-guard Latin (read-inline ctx-file filename)
let-math \sums m1 m2 =
${\upper{\lower{\sum}{#m1}}{#m2}}
let-math \limto m1 m2 =
${\lower{\lim}{#m1 \to #m2}}
let-block ctx +frame content =
let pads = (10pt, 10pt, 10pt, 10pt) in
let decoset = VDecoSet.simple-frame-stroke 1pt (Color.gray 0.75) in
block-frame-breakable ctx pads decoset (fun ctx -> read-block ctx content)
let-block ctx +centering it =
line-break true true ctx (inline-fil ++ read-inline ctx it ++ inline-fil)
let-block ctx +p-latin content =
let ctx-latin = ctx |> set-font-size (get-font-size ctx *' 1.2) |> set-leading 20pt in
line-break true true ctx-latin
(inline-skip ((get-font-size ctx-latin) *' 2.) ++ read-inline ctx-latin content ++ inline-fil)
let-block ctx +image-frame content =
let pads = (10pt, 10pt, 10pt, 10pt) in
let decoset = VDecoSet.simple-frame-stroke 1pt Color.black in
block-frame-breakable ctx pads decoset (fun ctx -> read-block ctx '<+centering{#content;}>)
let-block ctx +paragraph-frame content =
let pads = (15pt, 15pt, 15pt, 15pt) in
let decoset = VDecoSet.simple-frame-stroke 1pt (Color.gray 0.75) in
block-frame-breakable ctx pads decoset (fun ctx -> read-block (ctx |> set-hyphen-penalty 150) content)
let-block ctx +math-list mlst =
let ib =
mlst |> List.fold-left-adjacent (fun ibacc m _ mnextopt -> (
let ib = embed-math ctx m in
match mnextopt with
| None -> ibacc ++ ib ++ inline-fil
| Some(_) -> ibacc ++ ib ++ discretionary 1000 inline-fil inline-fil inline-fil
)) inline-fil
in
line-break true true ctx ib
let-inline ctx \insert-image w path =
let img = load-image path in
use-image-by-width img w
let-block ctx +display-boxes content code =
read-block (ctx |> set-paragraph-margin 12pt 0pt) '<+frame(content);>
+++ read-block (ctx |> set-paragraph-margin 0pt 12pt) '<+code(code);>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment