LaTeX 數學書重排(Re-typeset)工程技能
目標與範圍
把掃描版 / PDF 版數學專著高保真重排為可編譯、可檢索、可跳轉的 LaTeX 原始碼的工程方法論與坑位庫。 實戰來源:
-
西文:Conway《A Course in Functional Analysis》GTM 96 全書重排(436 頁、11 章 + 3 附錄、 0 編譯錯誤 / 0 死鏈 / 1606 個內部跳轉)。
-
中文:徐森林、薛春華《數學分析(第一冊)》全書重排(551 頁、6 章 + 前言 + 參考文獻、 40 個章節原始檔、23 幅原生 TikZ、0 錯誤 / 0 缺字元 / 0 未定義引用 / 0 Overfull / PDF 層
??0)。 -
分章頁碼西文:Serre《Abelian l-Adic Representations and Elliptic Curves》全書重排 (203 頁原書 → 129 頁,前言 + 4 章 + 兩套參考文獻 + 索引,分章頁碼 I-1/II-42/B-5/Index-3, 0 錯誤 / 0 未定義 / 0 重複 label,手工編號陳述環境 + biblatex sortkey 鎖定原書編號)。
-
單卷連續頁碼西文:Samuel《Algebraic Theory of Numbers》全書重排(原書 110 頁正文 → 104 頁, 小節裸編號
Theorem 1/(1)、參考文獻 [1]–[9]、習題按章編號、索引 V.2 鏈接; 371 label / 846 內部鏈接目標 / 922 PDF Link 註釋 / 110 Q.E.D.,0 錯誤 / 0 死鏈 / 鏈接顏色實測 (0,0,178))。 -
適用:原書重排(不翻譯)。三條路線:① Springer GTM 類單計數器版式(
gtmitem共享計數器, 編號\thesection.\arabic{gtmitem});② 中文書自建 cls(xeCJK + Fandol,按章分檔案 + 生成器落盤); ③ 分章頁碼專著自建 cls(\chapcode+ 重定義\thepage,手工編號陳述環境); ④ 單卷連續頁碼、小節裸編號專著自建 cls(按關鍵詞分計數器 + 按節重啟、只鎖分部起點的\folio)。 圖形按下文「普通數學插圖」分流:可編輯重繪用原生 TikZ;保真複用可保留原書向量 PDF。 -
不適用:mathtranslation 類純翻譯項目(屬
mathtranslation技能)。
何時使用
- 用戶說「重排某書」「把 PDF 排成 LaTeX」「補交叉引用」「修 overfull」「公式編號錯位」「OCR 亂碼」。
- 接手一個重排項目,需要先建立紀律紅線再動手。
- 編譯出現
multiply defined/undefined references/ 編號錯位 / 大量 overfull。
硬性紀律(紅線,動手前確認)
| 項 | 要求 |
|---|---|
| 行尾 | CRLF,UTF-8 無 BOM(.tex/.cls/.py 全部) |
| 建構 | xelatex -interaction=batchmode main.tex × 3(改 label 後清 aux × 4) |
| 品質紅線 | 0 編譯錯誤、0 未定義引用、0 缺字元、新增章節 0 overfull |
| 內容來源 | 以原書 PDF 圖像為準,OCR 僅作檢索索引 |
| 改內容 | 只改生成器(make_chNN_secM.py)→ assemble;絕不直接編輯 chapters/*.tex |
| 編號 | 先按原書選路線:GTM 用 gtmitem 共享計數器;手工編號專著或試卷可用原始顯示號 + 隱藏錨點計數器。不得為連續性擅改原號 |
| 公式 | 未編號行間公式用裸 \[\] / align*,或 equation\notag;嚴禁給它們編號 |
| 圖形 | 重繪優先原生 TikZ/PGFPlots;原書有可靠向量圖時可直接保留向量 PDF。禁止把向量圖先轉 PNG 再聲稱無損;原書本身的點陣圖須記錄原始限制 |
原書頁碼映射
物理頁 = 書頁 + offset(GTM96 offset = 15)。先量出偏移,後續所有「回原書核對」都按物理頁定位。
普通數學插圖:保真、可讀與逐圖驗收
本節適用於曲線、曲面、向量場、座標網格、定向/邊界、分面幾何圖等; 交換圖繼續執行下一節的逐邊審計。使用兩技能共用的 插圖修復流程,不要機械套用某一本書的裁框或縮放比例。
先獨立盤點原書與實際建構鏈中的圖,再建逐圖檯帳,記錄物理頁/裁框、圖號、 所有子圖、標籤、箭頭/定向、源資產、最終 PDF 頁與驗證證據。相同數量或相同檔名 不能排除「錯圖替代了正確圖」;核對相鄰圖,尤其同頁多圖及左右側排圖註。
優先保留原書可靠的向量內容;需中文化、統一字型或修復幾何時用原生 TikZ/PGFPlots 重繪。重繪前列出可見數學事實:座標/曲線關係、向量端點、水平集條數與數值、 定向、邊界符號、遮擋和投影。不得為美觀改變這些事實。複雜曲面與場圖不應退化成 含義相近的示意圖。重新排布子圖須保留閱讀順序、比例意義與連接關係。
400 DPI 渲染只是點陣圖;真正向量複用須保留 PDF 路徑/字形/透明度,並複查輸出。 繪圖包給出的路徑包圍框可能含曲線控制點或受內部裁切約束,既不能盲目取聯集, 也不能把它與裁框相交直接當成截斷證據。自動裁圖只生成候選;必須目視核對 完整原頁、候選圖、最終書頁。保留細箭頭、遠處標籤、子圖編號與適當安全邊。
圖幅由最終字型大小與頁面空間決定,不設全書統一寬度下限/上限;寬度使用局部
\linewidth,保持縱橫比。密集分圖可放大或重排,不能靠裁掉邊緣/標籤來縮小。
全書交付須逐圖有最終頁對應關係;編譯通過、256 個圖號對應 256 個檔案、
像素相似度高,都分別不能代替內容、覆蓋率和目視驗收。
交換圖與箭頭保真審校
本節專指由節點和態射組成的交換圖、正合列網格、拉回/推出圖等;普通幾何插圖、曲線圖和公式矩陣仍按各自規則處理。繪製或審校時使用 tikzcd,不要預設用 array 拼箭頭圖。發現舊稿時不能只搜 tikzcd:運行配套審計技能的 scripts/inventory_diagrams.py,覆蓋所有實際參與建構的原始檔、輸入檔案、腳註/附錄和鉅集定義;候選逐項分類為交換圖、公式/表格、待展開鉅集或未決。array/aligned/matrix/CD/xymatrix 中的箭頭圖同樣納入,普通矩陣不因含矩陣環境而機械遷移。
逐圖分別從原書 PDF 與重排稿建立節點網格和邊清單,再逐邊比較:起點、終點、箭頭頭端、單射鉤端、雙頭/等號/無頭線、實虛線、標籤及側別、空節點與零行列。r/l/u/d 是幾何位移,不能代替對映射方向的判斷;檢查顯式 from/to、反向箭頭選項、命名節點及實際展開後的鉅集。單射必須在最終 PDF 中確實顯示鉤,滿射顯示雙頭。hook' 只換鉤所在側,不會反轉箭頭;標籤中的 \hookrightarrow 也不會改變邊樣式。檢查局部選項與 \tikzcdset、every arrow/.style、自訂鉅集的疊加順序,後續 rightarrow 等設置可能抹掉前面的 hook。編譯成功及原始碼裡出現 hook 都不能代替端部核對。
以原書出版版圖像確定節點和箭頭的可見事實;原始 TeX、OCR、數學語義只作輔助證據。分別映射原書和重排稿物理頁,不用定理/證明的頁碼直接推定圖所在頁。先看整圖結構,再放大檢查鉤、雙頭、箭頭端點及裁切;同時檢查孤立小樣和最終書頁。
若無法直接查看圖像,先確認本地圖片路徑和查看工具,再重試一次;路徑/工具錯誤不等同於模型沒有視覺能力。仍無法目視時,按配套技能的無視覺核驗流程:從原始碼按頂層 &/\\ 展開網格(保留空節點並處理巢狀鉅集),核對邊方向和生效樣式;在已確認的 PDF 裁剪區域檢查文字跨度與向量路徑/字形,區分原始碼拓樸、PDF 幾何和直接目視三類證據。PDF 沒提取到箭頭頭筆畫不能證明原圖沒有箭頭。保留無法確認的具體圖、邊、行號、原書頁/裁剪位置;這些細節必須標為未決,不能用編譯通過或 OCR 的 → 代替視覺驗收。
關鍵坑位速查
完整表見 references/pitfalls.md。最高頻:
- PDF 雙層文本陷阱:原書內嵌
HiddenHorzOCR隱藏文字層,get_text()混排吐亂碼 (Jf=ℋ、&i(=ℬ)。公式必須get_pixmap渲染目視確認。 - 編號公式共享計數器:編號行間公式用
gtmeq(推進計數器);左側空白的號用equation\notag(不推進)。裸equation會掉進 equation 計數器渲染成章號。 - Claim 按章編號:第一/二章
claim*無號,第三/四/九章claim帶號。 - 不要憑語義加環境標籤:原書大量裸段落,誤包
remark會吃掉編號、頂高後續全部條目。 - 交叉引用 A–E(詳見
references/crossref.md):\item前\gtmtarget錯位、習題塊兩種寫法、 正則\\S誤傷、批量補空格二次置換 + 陳舊 .aux 假錯誤、補零章號 / 空\ref{}。 \pagestyle{empty}洩漏(全書頁首頁尾遺失):扉頁檔案設\pagestyle{empty}卻從不恢復, 致全書所有續頁無頁首無頁碼。\thispagestyle只影響首頁,須在章/前置/文獻/索引各頭鉅集裡 顯式\pagestyle{fancy}恢復(詳見下文「分章頁碼專著專項」)。
分章頁碼專著專項(\chapcode 版式)
Serre 類原書每章頁碼獨立起算且帶章前綴(I-1…I-30、II-1…II-42、B-1…B-8、Index-1…Index-3),
自建 cls 比 GTM 共享計數器路線多一整類坑,完整版見 references/chapcode-retypeset.md。最高頻五條:
| 症狀 | 正解 |
|---|---|
| 全書續頁無頁首無頁碼 | front/titlepages.tex 的 \pagestyle{empty} 洩漏;在每個頭鉅集(\chapterhead/\fmhead/bib/index)內顯式 \pagestyle{...} 恢復,不能只靠 \thispagestyle(只管首頁) |
頁碼格式被 \pagenumbering 重置 | kernel \pagenumbering{roman} 重定義 \thepage;須把「列印格式」與「計數」分離,每次 \pagenumbering 後重建 \thepage/\theHpage(後者 = 列印頁碼,使錨點與頁碼一致) |
| 前置 folio 反覆跳頁 / 列印兩次 | \fmhead[folio#] 只在目標 folio > 當前值時才 bump(只進不退),避免向前跳頁 |
| 陳述編號與原書不符 | 原書手工編號(有號/無號混排、常重新起數):用「手工編號參數 + 隱藏錨點計數器」,\begin{stmt}{LEMMA}{3},無號則第二參空 |
| biblatex 編號打亂原書順序 | 自訂排序模板 + 每條 sortkey 欄位,把 refnumber 鎖死原書 [1]–[88] |
| 分 category 列印恰好丟每條 category 的末條 | \addtocategory 的收尾 } 另起一行 → TeX 把換行讀成空格,末鍵變 xxx␠,biblatex 記進 .aux 後匹配不到條目。修:末鍵行尾加 % 吞換行。先查 .aux 的 \abx@aux@category{...} 有無尾空格(defernumbers=true 修不了) |
| 目錄頁碼是死鏈 | hyperref 部分頁不生成 page.<folio> 目標;改用 \hyperref[<條目自己的 label>](章 chap:I/節 sec:I.2/文獻 bib:main),\@ifundefined{r@…} 兜底回退 \hyperlink{page.<folio>} |
分章頁碼書的頁首四類約定(照原書逐類核對,references/chapcode-retypeset.md 有完整表):
正文各章(偶頁書名/奇頁章短題)、前置部分(節名取代書名)、正/補充參考文獻、索引(兩側僅外側裸頁碼)。
小節裸編號專著專項(Samuel 類)
單卷、連續阿拉伯頁碼、陳述按關鍵詞分計數器並按節重啟印裸號、公式按節重啟印 (1)、
參考文獻 [n]、習題按章編號的書,完整版見 references/samuel-style-retypeset.md。最高頻九條:
| 症狀 | 正解 |
|---|---|
| 有名字的陳述後編號錯位(Proposition 3 印成 2) | statement 包裝器必須無條件 \refstepcounter,可選參數只負責列印名字 |
| 逐頁對不上掃描頁 | 不要逐頁強排;只在章/Supplement/Exercises/Bib/Index 起點調 \folio{n}(只進不退) |
| 頁首要顯示本節在頁內的節號區間 | \pagefirstsec + \afterpage 記上一頁第一節;verso folio|章名|§§ c.a–c.b,recto 反向 |
外部文獻章號被誤鏈([1], Algèbre, Chapter VI、Chapter V of [9]) | 按 [n] 與 Chapter 的鄰近、of [n]、\emph{Algèbre} 三條規則排除,先保護 \divhead{Chapter X} |
參考文獻 [n] 點不動 | \item[\textbf{[n]}] \phantomsection\label{bib:n};正文 \hyperref[bib:n]{[n]}(顯示文字鎖死) |
| 習題引用鏈不上 | \exitem 內 \refstepcounter{exno} + \label{exer:章.n};每章 \exchap{X} 重置;Review Problems 用 R1/R2/R3 防與末章重號 |
列表條目 (1)(2) 無錨點 | \item\label{prop:c.s.i};正文仍寫 \hyperref[...]{(1)},因 enumerate 的 \ref 不帶括號 |
| 裸引用審計滿屏假陽性 | 必須整段屏蔽 \hyperref[...]{...}(花括號配平);\[...\] 屏蔽要 re.S |
.aux 報 label 不存在 / 顏色原始碼與 PDF 不符 | \newlabel 用配平解析(條目值形如 {{(1)}});顏色用 300 dpi 取樣 Link 矩形斷言 (0,0,178) |
建構:cls 用了 fontspec 時 pdflatex 必失敗(fontspec requires XeTeX or LuaTeX),
用 lualatex/xelatex;latexmk 殘留 fdb 仍可能拉 pdflatex,必要時直接呼叫。
中文書(xeCJK)專項
中文數學書重排有一整類西文書遇不到的坑,完整版見 references/cjk-retypeset.md。最高頻五條:
| 症狀 | 正解 |
|---|---|
TikZ \draw/\fill/\path[domain=…] plot (…) 解析失敗 | 改 plot[smooth] coordinates{…},座標由 scripts/gen_tikz_curve.py 在 Python 裡算好注入 |
Missing character: … (U+6685) in font FandolSong | Fandol 全字族缺生僻字;cls 加 \newCJKfontfamily\zmbhan{SimSun} 回退族,正文 祖{\zmbhan 暅} |
純 CJK 行 2–3pt Overfull,\hspace{0pt plus 3pt} 無效、plus 1fil 出巨隙 | \tracingparagraphs 先診斷;正解是局部 \begingroup\xeCJKsetup{CJKglue={\hskip 0pt plus 1pt}}…\endgroup 均勻鬆排 |
密集刻度標籤重疊(2n / 2n+1 / 2n+2) | 照原書用「錯落下沉」或「斜引線」兩種佈局,勿硬擠一行 |
全書出現 \extref{6.3.2} 純文本引用 | 目標章節落盤後回填為 定理~\ref{thm:6.3.2},且只改生成器源頭再重新落盤 |
中文書另有三條易誤判為缺陷的「正常現象」:
xelatex fatal: memory exhausted(瞬時記憶體壓力,重跑即過)、
正文末尾空白頁(\makebibliography 內 \cleardoublepage,與原書奇偶一致即預期版式)、
底料 OCR 跨頁截斷漏題(須對照影印頁逐題點數)。
交叉引用補全(七輪遞進)
正文硬編碼引用(Theorem X.Y / (2.3) / Exercise N / Section N)→ 超連結 \ref/\eqref 的完整策略,
見 references/crossref.md:先規範化 label 命名(kind:c.s.i)、補 sec:/exercise: label,
再跨章 → 章內括號 → 章內裸編號逐輪轉換,每輪編譯驗證。
單卷裸編號書另有三類 crossref.md 未覆蓋的物件:參考文獻 [n](錨在條目行、正文用
\hyperref[bib:n]{[n]})、按章習題號(exer:c.n,Review Problems 另用 R 前綴)、
陳述內列表條目 (1)(2)(\item\label{...})。另有兩類必須保留純文本:外部著作自身的
Chapter 號、原書筆誤(如 “§4, Proposition 2” 而該節只有 Proposition 1——保留印刷字,
鏈接指向真實目標並記入 STATE.md)。詳見 references/samuel-style-retypeset.md。
配套審計技能(已安裝,按需呼叫)
latex-eq-numbering-audit— 編號公式與原書逐項核對latex-display-layout-audit— 行間公式版式(over-wrap / 假對齊)latex-footnote-fidelity-audit— 腳註是否全部落地latex-ocr-math-defect-audit— OCR 靜默毀壞的數學- 交換圖審計技能 — 舊式圖候選盤點、逐邊方向/鉤/雙頭核驗、樣式覆蓋檢查與無視覺證據流程
latex-bookmark-anchor-audit— PDF 書籤錨點mathtranslation— xelatex/biber 編譯與視覺驗證(references/build-verify.md)
驗收門檻
見 references/verification.md:清 aux 後 4 遍 exit=0;0 錯誤 / 0 重複 / 0 未定義 / 0 死鏈;
習題編號逐節連續;CRLF/BOM 合規;原書自身編號不一致處保留純文本並審計數量。
中文書額外三項(用 scripts/verify_cjk_book.py main.pdf --log main.log --bib-page N 一次跑完):
PDF 文本層 ?? 0 處、Missing character 0 處、回填後的引用在 PDF 中確實解析為編號(而非原文)。
分章頁碼書額外一項:用 scripts/dump_page_heads.py main.pdf 逐頁 dump 頂/底文字帶,
斷言每一續頁都有頁首與頁碼、每一首頁無頁首而底部居中裸頁碼,且頁碼格式(I-2 / B-5 / Index-3 / 羅馬數字)正確。
目錄頁碼超連結另用 --check-toc-links 斷言 page.* 命名目標全部解析。
單卷裸編號書額外兩項:scripts/audit_internal_links.py 斷言全部 \ref/\eqref/\pageref/\hyperref
目標 0 缺失(不要只查 \ref);scripts/check_link_color.py main.pdf --expect 0,0,178 用像素取樣
斷言鏈接顏色(原始碼裡的 colorlinks 不算證據)。裸引用掃描用 scripts/audit_bare_xrefs.py,
殘留項必須逐條判定是「列表標號/外部文獻」而不是引用。
關鍵腳本
scripts/audit_text_refs.py:掃描.tex列出尚未\ref化的硬編碼引用(開工清單,不改檔案)。scripts/rebuild_exercise_labels.py:安全重建exercise:c.s.i(預設 dry-run,正確處理同行\gtmtarget與手工習題塊)。scripts/gen_tikz_curve.py:xeCJK cls 下plot[domain=…]不可用,用它把參數 / 笛卡爾 / 極座標 曲線算成plot[smooth] coordinates{…}字面量(--wrap直接輸出完整\draw)。scripts/verify_cjk_book.py:全書終檢器(??殘留 / 書籤條數 / 回填引用落點 / 參考文獻條目 / 缺字元),任一硬門檻不過即 exit=1;交付前必跑。scripts/dump_page_heads.py:分章頁碼書頁首/頁碼終檢器。逐頁 dump 頂/底文字帶,報告每頁的 running head 與 folio;--check-toc-links另斷言目錄page.*命名目標全部解析。scripts/audit_internal_links.py:把\ref/\eqref/\pageref/\hyperref[...]全部對main.aux核驗(\newlabel花括號配平;自動跳過work/bak/render/build備份目錄),有缺失即 exit=1。scripts/audit_bare_xrefs.py:先整段屏蔽已鏈接文本、數學、\item[...]/\pdfbookmark[...]等可選參數,再列舉裸Theorem 3/(4)/[3]/exercise 8,輸出 STMT/PAREN/FORM/BIB/EXERC 計數。scripts/check_link_color.py:渲染 PDF、對每個 Link 矩形做非白像素直方圖,斷言鏈接文字顏色;--expect 0,0,178對應blue!70!black,防\hypersetup後寫覆蓋。
Resources
references/discipline.md— 文件類 / 計數器速查、頁碼映射、文獻區排版參數references/pitfalls.md— 西文書全部坑位(OCR / 編號公式 / Claim / 環境標籤 / overfull / 交叉引用 A–E)references/cjk-retypeset.md— 中文書專項(TikZ 曲線 / 缺字回退 / CJKglue 鬆排 / 標籤重疊 / extref 回填 / memory exhausted / biber 書目 / 單一落盤出口)references/chapcode-retypeset.md— 分章頁碼專著專項(\chapcode頁碼機制 /\pagestyle{empty}洩漏 / 四類頁首約定 / 手工編號陳述 / biblatex sortkey 鎖定 / 目錄頁碼超連結)references/samuel-style-retypeset.md— 單卷裸編號專著專項(按關鍵詞/按節重啟編號、\folio只鎖分部起點、頁首節號區間、外部文獻章號排除、bib:n與exer:錨點、列表條目引用、.aux配平解析、鏈接顏色像素驗收)references/crossref.md— 交叉引用七輪補全策略 + 習題重建演算法 + 保留純文字清單references/verification.md— 建構命令、驗收清單、CRLF/BOM 檢查scripts/audit_text_refs.py— 硬編碼引用掃描器scripts/rebuild_exercise_labels.py— 習題 label 安全重建器scripts/gen_tikz_curve.py— 參數/笛卡爾/極座標曲線 →plot[smooth] coordinates{…}片段scripts/verify_cjk_book.py— 全書終檢(PDF 層??/ 書籤 / 回填引用落點 / 參考文獻條目 / 缺字元)scripts/dump_page_heads.py— 分章頁碼書頁首/頁碼 + 目錄頁碼超連結終檢器scripts/audit_internal_links.py— 全部內部鏈接目標(\ref/\eqref/\pageref/\hyperref)對 aux 核驗scripts/audit_bare_xrefs.py— 屏蔽已鏈接文本後的裸引用列舉(STMT/PAREN/FORM/BIB/EXERC)scripts/check_link_color.py— PDF Link 矩形像素取樣,斷言鏈接顏色(預設0,0,178)
中文回憶版試卷合集
多校多年試卷、各卷獨立題號與分值、重排同時審題時,讀取 回憶版試卷專項。必須分開識別錯誤與原題錯誤,檢查被 OCR 丟棄的頁首頁尾是否藏著題號;未完成逐題證明時不將首輪初篩寫作全題已證正確。
有界並行與頁級 OCR 來源
全書任務需要縮小單個代理上下文時,參閱有界子代理、OCR頁級來源與索引映射。包含檔案所有權、代理中斷交接、修訂表查重、數學字型與陳述範圍、PDF 雜湊綁定驗收,以及 Ahlfors 底稿中跨頁段落搬移、分卷局部頁號重啟、一塊多圖、索引語義分組終審、疑點定案、腳註跨頁複核和編輯性校勘留痕的已驗證方法。