本文件是《ACPI ASL 從零到實戰》各模組撰寫者的統一規範。 動筆前必讀三個檔案:
- 本指南
acpibook.sty— 所有可用的巨集與環境定義modules/module01.tex— 品質與風格標竿(exemplar),你的輸出必須與它同風格
專案結構
main.tex 主檔(勿修改)
acpibook.sty 樣式檔(勿修改)
harness.tex 單模組編譯測試框架(勿修改)
modules/moduleNN.tex 各模組內容(你要寫的檔案)
modules/projects.tex 實戰專案
章節編號對照表(固定,不可變動)
| Module | 檔案 | 章 | Part 標題 | 難度 |
|---|---|---|---|---|
| 1 | module01.tex | 1 | ACPI 基礎與架構 | 1 |
| 2 | module02.tex | 2–3 | ASL、AML 與 ACPI Namespace | 2 |
| 3 | module03.tex | 4–7 | ASL 基本語法 | 2 |
| 4 | module04.tex | 8 | Device 與硬體描述 | 3 |
| 5 | module05.tex | 9–11 | OperationRegion 與 Field | 3 |
| 6 | module06.tex | 12–14 | Control Method | 3 |
| 7 | module07.tex | 15–17 | Power Management | 4 |
| 8 | module08.tex | 18–20 | DSDT / SSDT 實戰 | 4 |
| 9 | module09.tex | 21 | iASL Toolchain | 4 |
| 10 | module10.tex | 22–24 | Linux ACPI Debugging | 4 |
| 11 | module11.tex | 25 | 進階整合:ACPI、C/C++ 與 Linux Kernel | 5 |
| 12 | projects.tex | 26–30 | 實戰專案 | 5 |
正文中提到其他章節時,直接寫「第 9 章」「Module 7」這種文字(編號固定),
不要跨檔案使用 \ref。
檔案骨架
每個模組檔案的結構:
% ============================================================
% Module N:標題(第 X–Y 章)
% ============================================================
\acpipart{Part 標題}{難度數字 1-5}{模組簡介,2–4 句話,說明本模組解決什麼問題、學完能做什麼。}
\chapter{章標題}
\label{ch:唯一標籤}
一到兩段導言(不放在任何框裡):為什麼需要本章、與前一章的銜接。
\begin{goalbox}
\begin{itemize}
\item 具體、可檢驗的學習目標(4–6 條,用「說明/寫出/畫出/除錯」等動詞開頭)。
\end{itemize}
\end{goalbox}
\section{...} % 正文若干節
...
% 每章固定以這兩個框收尾:
\begin{keybox}[本章重點回顧]
\begin{itemize} 4–6 條重點 \end{itemize}
\end{keybox}
\begin{exbox}
\begin{enumerate} 3–5 題,由淺入深,最後一題動手實作 \end{enumerate}
\end{exbox}
可用環境與巨集(cookbook)
教學彩框(皆可加選用子標題 [子標題])
\begin{keybox}[OSPM 的分工] ... \end{keybox} % 核心觀念(藍)
\begin{notebox} ... \end{notebox} % 補充說明(青)
\begin{warnbox}[常見誤解] ... \end{warnbox} % 注意(橘)
\begin{exbox} ... \end{exbox} % 動手練習(綠)
\begin{labbox}[逐步操作] ... \end{labbox} % Lab 實作步驟(青藍)
\begin{goalbox} ... \end{goalbox} % 本章學習目標(紫,無選用參數)
禁止把 asl/shell/clang/asciitree 程式碼環境放進任何彩框內。
框內可用 \code{...}、itemize、enumerate、粗體。
程式碼環境(都支援 [title={...}])
\begin{asl}[title={範例:test.dsl}] % ASL 程式碼(關鍵字自動上色)
DefinitionBlock ("test.aml", "SSDT", 2, "DEMO", "TEST", 0x00000001)
{
...
}
\end{asl}
\begin{shell}[title={...}] % 終端機指令與輸出
$ iasl test.dsl
\end{shell}
\begin{clang}[title={...}] % C 語言(Linux kernel / driver 範例)
\end{clang}
\begin{asciitree}[title={...}] % Namespace 樹、表鏈結構等 ASCII 圖
\
├── _SB_
│ ├── PCI0
│ └── EC0_
└── _TZ_
\end{asciitree}
規則:
- 程式碼環境內是 verbatim,底線、反斜線直接寫,不要跳脫。
asl/shell/clang內只能有 ASCII;註解一律英文。asciitree內可以用中文與這些字元:│ ├ └ ─ ← ↓ →(已驗證可渲染)。- 每個 ASL 範例必須是語法正確、
iasl可編譯的(或明確標註為片段)。 - 行寬 ≤ 72 字元,縮排 4 空格。
流程圖
\begin{vflow}[4.5mm] % 垂直流程;參數 = 節點間距(可省略)
\fnode{Hardware}
\fnode{BIOS / UEFI}
\fnodel{iasl 編譯}{AML} % 箭頭旁帶標籤
\fnode[flownodealt]{重點節點} % 金色變體
\end{vflow}
\begin{hflow} % 水平流程(節點自動縮小)
\fnode{ASL}
\fnodel[above]{iasl}{AML} % 水平流程的標籤放 above
\end{hflow}
- 節點文字可含中文;可用
\\換行(例如加{\scriptsize 副標})。 - 垂直流程 ≤ 9 個節點;水平流程 ≤ 5 個節點以免超寬。
- 節點內不要放引號
"。
行內巨集
\code{\_HID} % 行內程式碼;底線必須跳脫成 \_
\nspath{\_SB.PCI0.LPCB} % 帶根反斜線的 namespace 路徑(自動加 \)
\keyterm{OSPM} % 首次出現的關鍵術語(藍色粗體)
表格(統一 booktabs 風格)
\begin{center}
\small
\begin{tabular}{llL{6.8cm}} % L{寬度} = 自動換行的靠左欄
\toprule
\rowcolor{acpiblue!10}
\textbf{欄一} & \textbf{欄二} & \textbf{說明} \\
\midrule
... & ... & ... \\
\bottomrule
\end{tabular}
\end{center}
不要用 \begin{table} 浮動環境,一律用上面的 center 寫法。
LaTeX 撰寫鐵律(違反會編譯失敗)
- 正文(非程式碼環境)中:
_必須寫成\_,&寫成\&,%寫成\%,#寫成\#。這是最常見的錯誤來源。 - 正文中不可出現 Unicode 箭頭(→ ↓ ←),請用
$\to$或改寫文字;asciitree環境內例外。 - 反斜線路徑在正文中一律用
\nspath{\_SB.PCI0},不要手寫\textbackslash。 - 不可
\usepackage、不可定義新巨集、不可修改acpibook.sty。 \part不可直接使用,只能用\acpipart{...}{...}{...}(每檔一次,除非該檔含兩個模組)。- 中文引號用「」;破折號用——;省略號用……。
\label加上模組前綴避免衝突(如ch:namespace、ch:field)。- 每個環境的
\begin/\end務必配對;itemize/enumerate 內的 item 文字若含\code{}沒問題,但不要在 item 內開程式碼環境。
內容風格
- 語言:台灣慣用的繁體中文;技術名詞保留英文 (Namespace、Method、Device、OperationRegion、Interpreter、bring-up……)。
- 口吻比照
module01.tex:像資深韌體工程師帶新人,先講「為什麼」再講「怎麼做」, 用具體場景(筆電電池、上蓋開關、I2C 溫度感測器)當例子。 - 每章節奏:觀念講解 → 完整範例 → 逐行拆解 → 常見陷阱 → 練習。
- 每章至少:1 張流程圖或 asciitree、1 個完整 ASL 範例、1 個 warnbox(常見錯誤)、 1 個 notebox(規格或實務補充)。
- 逐行拆解:程式碼列出後,用文字或 itemize 解釋關鍵行在做什麼、為什麼這樣寫。
- 每章篇幅目標:排版後 5–8 頁(約 250–420 行 LaTeX)。
- 內容以 ACPI 6.5 與 ACPICA 現行工具為準;新舊語法(legacy operator 與 ASL 2.0 symbolic operator)都要教,並說明實務上何時會遇到哪種。
自我驗證(必做)
寫完後,在專案根目錄用 harness 單獨編譯你的檔案(jobname 用你的模組號, 避免與其他人衝突):
xelatex -jobname=chk02 -interaction=nonstopmode "\def\modfile{modules/module02}\input{harness.tex}"
rg -n "^!" chk02.log # 必須無輸出(無錯誤)
rg -n "Missing character" chk02.log # 必須無輸出(無缺字)
若一個檔案含兩個模組(如 module04 + module05),兩個檔案都要各自通過。
編譯錯誤必須自己修到乾淨才算完成。完成後刪除 chkNN.* 產物(rm -f chkNN.*)。