「排版論」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) (→雜談) |
||
(未顯示同一使用者於中間所作的 9 次修訂) | |||
行 1: | 行 1: | ||
{{Nav|程式語言、邏輯學}} | {{Nav|程式語言、邏輯學}} | ||
排版學其實也可以用數學化約之 (to some degree),但是要定 spec。 | |||
<math>TotalCostMain(j) =\begin{cases} min_{0 \leq k < i} (TotalCost(k) + 0 * LineCost(k+1, i))~~if~~LineCost(k+1, i) < \infty \\ | |||
\infty ~~if~~LineCost(k+1, i) = \infty | |||
\end{cases} | |||
</math> | |||
其中<math> LineCost(k+1, i) </math> 是最後一行的成本。 | |||
<math>TotalCost(i) = \begin{cases} LineCost(0,i)^3~~~~if~~~LineCost(0, i)<\infty \\ | |||
min_{j}~TotalCost(j) + LineCost(j, i)^3~~~~j=0, 1, ..., i-1~~if~~~LineCost(0, i)=\infty | |||
\end{cases}</math> | |||
<math> | |||
LineCost(j, i)= \begin{cases} | |||
\infty ~~~ if~~LineWidth - \sum_{k=j+1}^{i-1} OrigWidth(item[k]) - NewLineWidth(item[i]) < 0 \\ | |||
\infty~~if~~NOT~~breakable(item[i]) \\ | |||
(LineWidth - \sum_{k=j+1}^{i-1} OrigWidth(item[k]) - NewLineWidth(item[i])) ~~elsewhere | |||
\end{cases} </math> | |||
==雜談== | |||
*20231114: | |||
<pre>一個排版軟體會面臨一個問題: | |||
假設我在第5頁需要引用下文某個文字的位置p,輸出f(p)的字串,f是任意函數。 | |||
那p 一定受到 f(p) 影響,所以 p = g(f(p)), | |||
但這樣可好了,p = g(f(g(f(...(p)))) | |||
如果p 不是不動點那絕對求不出來。 | |||
所以排版軟體一定會面臨到編譯的頁碼誤差,因為p有時候無法求得。</pre> | |||
=以下為草稿= | |||
==word 的問題== | |||
*分頁 | |||
** 斷頭 | |||
** 斷尾 | |||
** 可選分頁 | |||
** 強制分頁 | |||
* Miniframe 的問題 | |||
==字圖 glyph== | ==字圖 glyph== | ||
我們需要下面的函數,得到單位量度: | |||
# get_ex(font, size) | |||
# get_em(font, size) | |||
# get_total_height(font, size, glyph) #得總高 | |||
# get_height(font, size, glyph) #得頂至基線 | |||
# get_width(font,size, glyph) #得寬 | |||
# get_depth(font, size, glyph) #得深 | |||
# get_ex(font, size) #得ex | |||
# get_em(font, size) #得em | |||
==行(line)== | ==行(line)== |
於 2023年11月24日 (五) 22:53 的最新修訂
排版學其實也可以用數學化約之 (to some degree),但是要定 spec。
其中 是最後一行的成本。
雜談
- 20231114:
一個排版軟體會面臨一個問題: 假設我在第5頁需要引用下文某個文字的位置p,輸出f(p)的字串,f是任意函數。 那p 一定受到 f(p) 影響,所以 p = g(f(p)), 但這樣可好了,p = g(f(g(f(...(p)))) 如果p 不是不動點那絕對求不出來。 所以排版軟體一定會面臨到編譯的頁碼誤差,因為p有時候無法求得。
以下為草稿
word 的問題
- 分頁
- 斷頭
- 斷尾
- 可選分頁
- 強制分頁
- Miniframe 的問題
字圖 glyph
我們需要下面的函數,得到單位量度:
- get_ex(font, size)
- get_em(font, size)
- get_total_height(font, size, glyph) #得總高
- get_height(font, size, glyph) #得頂至基線
- get_width(font,size, glyph) #得寬
- get_depth(font, size, glyph) #得深
- get_ex(font, size) #得ex
- get_em(font, size) #得em
行(line)
將 glyphs 放置的一行文字區塊。比如說下文。
| 我今天坐公車離開臺中市 | <- 行1 | | | 然後)往臺南旅行。 | <- 行2
行有基線 baseline,且有方向 (textDirection),分成兩種,四值:
- 基線在字圖之底:
- RTL 如西文。
- LTR 如希伯來和阿拉伯文。
- 基線在字圖之左:
- BTT 由下而上,罕用。
- TTB 由上而下,如對聯、蒙古文字。
計算行高方式 (automatic-height)
我們可以定義line的depth「行的深度(基線到底/左之距)」和height「行的高度(基線到頂/右)之距」,是 auto 和 fixed,將變數儲存於 automatic-height。
若「automatic-height = auto」,則depth公式如下計算:
line.depth = max(glyph[i].depth) for i in range(len(line.glyphs))
line.height = max(glyph[i].height) for i in range(len(line.glyphs))
以及行的高度(基線到上/右)取決於: