「排版論」修訂間的差異

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
(建立內容為「==字圖 glyph== ==行(line)== 將 glyphs 放置的一行文字區塊。比如說下文。 <pre> | 我今天坐公車離開臺中市 | <- 行1 |…」的新頁面)
 
 
(未顯示同一使用者於中間所作的 11 次修訂)
行 1: 行 1:
{{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)==
行 32: 行 87:
===模型層(資料大綱層)===
===模型層(資料大綱層)===
===顯示格式層===
===顯示格式層===
[[category:資訊]]

於 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

我們需要下面的函數,得到單位量度:

  1. get_ex(font, size)
  2. get_em(font, size)
  3. get_total_height(font, size, glyph) #得總高
  4. get_height(font, size, glyph) #得頂至基線
  5. get_width(font,size, glyph) #得寬
  6. get_depth(font, size, glyph) #得深
  7. get_ex(font, size) #得ex
  8. get_em(font, size) #得em

行(line)

將 glyphs 放置的一行文字區塊。比如說下文。

| 我今天坐公車離開臺中市 | <- 行1
|                        |
| 然後)往臺南旅行。      | <- 行2

行有基線 baseline,且有方向 (textDirection),分成兩種,四值:

  1. 基線在字圖之底:
    1. RTL 如西文。
    2. LTR 如希伯來和阿拉伯文。
  2. 基線在字圖之左:
    1. BTT 由下而上,罕用。
    2. 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))

以及行的高度(基線到上/右)取決於:

div

頁面

模型層(資料大綱層)

顯示格式層