TikZ Figure Code 是一项工程基础技能,目标是确定性地写出编译干净、不重叠、改一处不崩的 TikZ 代码。它不涉及“画什么图才美”,那属于设计/编排层(thesis-figure-skill)的职责;本技能只保证无论画什么,代码本身写对、扛得住编辑。
用途
模型写 TikZ 的默认习惯是“坐标凭感觉”,例如 \node at (5.2, 3.1)、\fill rectangle (x0,y0)(x1,y1),一格一格手摆。这种业余写法导致两类必然的痛:一是盲写,写到第 800 行时不知道渲染出来什么样,碰撞、溢出、箭头不贴框只能编译后看图才发现,被迫进入昂贵的“渲染→审查→修”循环;二是编辑即崩,同一个间距或中心被手抄在多处(zone 边界、内容中心、箭头坐标、底栏等),改一个 stage 宽度要同步 5 处,漏一处就崩,而静态 checker 抓不到。本技能提供的解法不是加更多检测,而是换写法:写一张约束图(相对定位 + fit + matrix),让布局引擎算位置,使图 correct by construction,而非 correct-after-review。
主要能力
核心原则是 LAYOUT BY CONSTRUCTION,不是 BY COORDINATE。该纪律施加在宏观骨架层(模块/zone 彼此怎么放、怎么连);嵌入 viz 内部(热力图一格格、柱状图)可以继续局部手画,但要用 \begin{scope}[shift={(parent.center)}] 挂到父节点 anchor,让它随父节点移动。
技能给出 5 条必须照做的 idiom:
① 布局节奏只放一处。同一个间距/行高/列宽只定义一次,到处引用,永不把同一个数字抄在多处。例如 \newlength{\stagew}\setlength{\stagew}{4.5cm}、\def\gap{0.5cm}、\tikzset{node distance=\gap}。
② 模块用相对定位摆,不用绝对 at (x,y)。第一个锚定,其余 right=of / below=of 前一个,间距活在 node distance 一处。网格/表格用 \matrix of nodes,流水线用 chains,别手动给 x 加 2cm。
③ 连线走节点 anchor,永不重抄边界坐标。例如 \draw[arrow] (s1.east) -- (s2.west);箭头引用节点,就永远不可能 misalign。这一条单独就能消灭评审环里一大半 bug。
④ 容器用 fit,标签用 text width(换行)不用 minimum width(撑大)。text width 让超长内容换行(保持框宽),minimum width 让框长出去(溢出邻居),前者把“碰撞 bug”(硬,必修)降级成“挤一点”(软,审美)。
⑤ 整体居中用 calc 中点,不手算。例如 \coordinate (c) at ($(first.north west)!0.5!(last.north east)$); \node[anchor=south] at ($(c)+(0,0.5)$) {标题}; 行变宽,标题自动跟着居中。
技能还列出 8 条硬约束,违反必失败,完整内容见 references/hard-constraints.md。最高频的几条包括:CJK 节点上 rotate=90 会渲成不可读色块,所有中文标注必须水平;\texttt{…中文…} 会报错,\texttt 只包纯英文代码;xelatex 对缺失字体静默失败,编译后必须 grep "Missing character" *.log,非 0 表示字体没解析(常是 CJK);直线单段 -- 上加 rounded corners 会产生端点鬼影弧,只在 ≥2 段折线 / |- 用;路径有弯折但没 \usetikzlibrary{bending} 会导致弯路上箭头 tip 必然 mis-align;(A.south) |- (B.west) 当 A.x 落在 B 的 x 范围内时,横线会穿过 B 内部(pierce),需用 waypoint 绕开或换 anchor。
关于 canonical 箭头,技能建议不要手写 -{Stealth[scale=X]},而用预定义 style,只调 line width(0.6/1.0/1.6pt 三档),tip 自动跟随,详见 ../thesis-figure-skill/references/tikz-template.tex 的 6 个 canonical styles。铁律包括:< 1.5cm 短箭头必用 arrow short(tip 3pt),否则默认 6.5pt tip 把 stem 吃光;fan-out 分叉的 stub 用 fan_stub(shorten <=0pt,紧贴 spine 无 gap),不用 arrow;\usetikzlibrary{bending} 必加载。
使用方式
工作流为:写 → lint → 看图。运行 bash references/lint.sh figure.tex,一个入口跑完:① tikz-validator(编译前静态:微斜线/溢出/碰撞)→ ② xelatex 编译 → ③ missing-char 闸门 → ④ pdf-overlap-checker(硬 bug vs 候选分开报)→ ⑤ design-linter(advisory)。退出码 0 = 无硬 bug,1 = 有硬 bug。
checker 是地板不是天花板。它消灭便宜的 20%(编译错、重叠、已知坑),抓不到贵的 80%(图记不记得住、跨面板数字自洽、新几何对不对)。lint 过了仍必须亲眼看渲染 PNG——很多崩坏(zone 重叠、边框切穿内容)static 全盲,只有看图才发现。
按需加载:要看 5 idiom 的完整代码模式,加载 references/by-construction.md;要看全部 8 条硬约束 + 修法,加载 references/hard-constraints.md;要对照 before/after,查看 references/examples/(BAD vs GOOD + 编辑安全证明图);要跑静态检查,执行 references/lint.sh(执行即可,不用 Read)。
适用场景
本技能适用于:写或审任何 TikZ 图代码、修排版/对齐/溢出/箭头 bug、处理 CJK 渲染问题。若要把论文文案/参考图变成成品配图(设计 + 编排 + 视觉迭代 + skeleton 复用),应使用 thesis-figure-skill,它在代码正确性层 compose 本技能。thesis-figure-skill 的 6 个 example-skeleton-*.tex 已全部按这 5 条 idiom 重写,是本技能最好的 worked examples。
限制
本技能不负责“画什么图才美”,不涉及设计/编排层。静态 checker 无法覆盖所有崩坏情况,lint 通过后仍需人工查看渲染 PNG。关于收费、价格、平台支持等具体信息,资料中暂未提供。