# Layouts

[English](LAYOUTS.md)

## 結構

```text
core/layout/       穩定 layout 框架
modules/layout/    內部 layout component 庫
catalog/impe-layouts-catalog.tex
```

公開的子系統入口為：

```text
core/layout/impe-layout-system.tex
```

## 分工

### `core/layout/`

這一層負責穩定機制：

- defaults
- 目前 document class 偵測
- preset 解析
- 相容性檢查
- load-once registry 行為

目前的 core 檔案分工如下：

- `impe-layout-system.tex`
  layout 子系統的公開入口。它會載入 defaults 層與集中式 preset catalog。
- `impe-layout-defaults.tex`
  載入內部 layout 各層邏輯，並定義系統預設的 target set。
- `impe-layout-class.tex`
  偵測目前文件類別，並提供 layout preset 相容性檢查所需的 helper。
- `impe-layout-preset.tex`
  定義 preset 的套用介面。它會解析 `targets`、`page`、`text`、`head`、`book`、`slides` 等欄位，再套用相容的 component list。
- `impe-layout-registry.tex`
  保存已註冊的 layout preset，並實作公開的 `\UseLayout` / `\UseLayouts` 以及 load-once registry 行為。

### `modules/layout/`

這一層現在保存內部可重用的 layout component 庫。

目前檔案為：

- `impe-layout-components.tex`
  定義 preset 會使用到的內部 component id，例如頁面 geometry、正文間距、頁眉樣式、book 行為與 slides helper。

### `catalog/impe-layouts-catalog.tex`

這個檔案負責註冊公開的 layout preset。

目前公開 preset 包括：

- `zh_doc`
- `report`
- `en_doc`
- `zh_book`
- `en_book`
- `beamer`

## Preset 模型

公開 layout preset 由內部 component slot 組成，例如：

- `page`
- `text`
- `head`
- `book`
- `slides`

系統會在執行 module code 之前，先根據目前的 document class 做相容性檢查。

Preset 是一組有 slot 結構的設定：

```tex
\LayoutPresetRegister{
  id = zh_book,
  targets = { book,report },
  page = page_a4_book,
  text = text_zh,
  head = head_fancy_chapter,
  book = { book_openright, book_blankpage_empty }
}
```

目前 preset 可用的欄位有：

- `targets`
  宣告這個 preset 可以在哪些 document class 下使用
- `page`
  頁面 geometry component list
- `text`
  正文行距 / 段落樣式 component list
- `head`
  頁眉 / page-style component list
- `book`
  book 類文件的額外行為 component list
- `slides`
  beamer / slides 類文件的行為 component list

若某個 slot 留空，系統就直接跳過，不會套用對應 component。

## 目前的公開 Presets

目前公開的 preset 以及它們實際套用的設定如下：

- `zh_doc`
  目標類別：`article`、`report`
  套用：`page_a4_26mm` + `text_zh`
- `report`
  目標類別：`report`
  套用：`page_a4_26mm` + `text_zh`
- `en_doc`
  目標類別：`article`、`report`
  套用：`page_a4_en_doc_145mm` + `text_en_doc`
- `zh_book`
  目標類別：`book`、`report`
  套用：`page_a4_book` + `text_zh` + `head_fancy_chapter` + `book_openright` + `book_blankpage_empty`
- `en_book`
  目標類別：`book`、`report`
  套用：`page_a4_en_book_145mm` + `text_en_book` + `head_fancy_chapter` + `book_openright` + `book_blankpage_empty`
- `beamer`
  目標類別：`beamer`
  套用：`text_beamer_dense` + `slides_madrid_nav`

## 目前的內部 Components

目前 `modules/layout/impe-layout-components.tex` 中存在的內部 component id 如下；它們正是各 preset 的實際構件：

- `page_a4_1in`
  A4 頁面，四邊 `1in` 邊界
- `page_a4_en_doc_145mm`
  A4 英文 article/report geometry，正文寬度約 `145mm`
- `page_a4_26mm`
  A4 頁面，四邊 `2.6cm` 邊界
- `page_a4_book`
  A4 雙面書籍 geometry，內側留較寬裝訂空間
- `page_a4_en_book_145mm`
  A4 英文雙面 book geometry，正文寬度約 `145mm`
- `text_en_doc`
  英文 article/report 正文樣式，`1.40` 行距、`0.25em` 段間距與一般段首縮排
- `text_en_book`
  英文 book 正文樣式，`1.42` 行距、`0.25em` 段間距與一般段首縮排
- `text_en`
  `text_en_doc` 的兼容別名
- `text_zh`
  中文正文樣式，較大的行距、首段縮排與調整過的列表間距
- `text_beamer_dense`
  投影片用的緊湊段落間距
- `head_fancy_chapter`
  透過 `fancyhdr` 提供章節型頁眉。固定頁眉標題預設取自
  `\title{...}` 第一行，也可用 `\HeaderTitle{...}` 覆寫
- `book_openright`
  強制章節從右頁開啟
- `book_blankpage_empty`
  讓補出的空白頁使用空白頁樣式
- `slides_madrid_nav`
  Madrid beamer theme 的設定，以及字體/agenda 相關 helper

這些 component id 目前屬於內部層，但它們決定了每個公開 preset 到底做了什麼。

## 公開介面

使用方式：

- `\UseLayout{...}`
- `\UseLayouts{...}`

一般使用時，這兩個就是目前支援的公開 layout 入口。

更底層一點，系統內部是透過：

- `\LayoutPresetRegister{...}`
- `\LayoutPresetDeclare{...}`

來建立與套用 preset。不過它們比較屬於系統建構介面，而不是日常使用者 API。

在倉庫內，一般會透過 `package/impe-system.tex` 的總入口載入，而不是單獨直接載入 layout 子系統。
