| 写出高质量、一次过编译、编辑安全的 TikZ/LaTeX 配图代码的工程基础技能。 教 agent 用「按构造布局」(positioning/fit/chains/anchor) 而非「手填绝对坐标」, 附 8 条硬约束、canonical 箭头、before/after 范例、一个静态检查入口 (lint.sh)。 tikz layout、latex figure code、tikz 编译报错、CJK 中文图渲染成色块。
npx skills add https://github.com/0xE1337/thesis-figure-skill --skill tikz-figure-code
这是确定性地基:怎么写出编译干净、不重叠、改一处不崩的 TikZ 代码。
它不管"画什么图才美"——那是设计/编排层(见 thesis-figure-skill)的事。
本技能管的是:无论画什么,代码本身得写对、扛得住编辑。
> 一句话定位:thesis-figure-skill 决定画什么,本技能保证怎么写不出错。
模型写 TikZ 的默认习惯是"坐标凭感觉"——\node at (5.2, 3.1)、\fill rectangle (x0,y0)(x1,y1),
一格一格手摆。这是业余写法,导致两类必然的痛:
解法不是加更多检测,是换写法。 专家写 TikZ 是写一张约束图(相对定位 + fit + matrix),
让布局引擎算位置——碰撞按构造不可能发生,图correct by construction,不是 correct-after-review。
证据:references/examples/ 里同一张 5-stage pipeline,绝对坐标版 (BAD) 和按构造版 (GOOD)
渲染视觉等价;但施加同一个最自然的编辑(加宽 hero / 加长 label),BAD 崩、GOOD 自动重排。
见 proof-edit-safety-hero-widen.png。
作用域:按构造纪律施加在宏观骨架层(模块/zone 彼此怎么放、怎么连)。
嵌入 viz 内部(热力图一格格、柱状图)可以继续局部手画——它自包含、坐标错了不级联——
但要用 \begin{scope}[shift={(parent.center)}] 挂到父节点 anchor,让它随父节点移动。
同一个间距/行高/列宽只定义一次,到处引用。永不把同一个数字抄在多处。
\newlength{\stagew}\setlength{\stagew}{4.5cm} % 改一处,全图跟着变
\def\gap{0.5cm}
\tikzset{node distance=\gap}
at (x,y)第一个锚定,其余 right=of / below=of 前一个。间距活在 node distance 一处。
\node[zone] (s1) at (0,0) {};
\node[zone, right=of s1] (s2) {}; % ✅ 间距由 node distance 决定
\node[zone, right=of s2] (s3) {}; % 加宽 s2 → s3 自动右移
% ❌ \node[zone] (s2) at (5,0) {}; % 手填 5 = 改 s1 宽度就得改这里
网格/表格用 \matrix of nodes,流水线用 chains——别手动给 x 加 2cm。
\draw[arrow] (s1.east) -- (s2.west); % ✅ 任何重排下都不会错位
% ❌ \draw[arrow] (4.5,5) -- (5.0,5); % 把 zone 边界又抄了一遍 = 改布局就断
箭头引用节点,就永远不可能 misalign。这一条单独就能消灭评审环里一大半 bug。
fit,标签用 text width(换行)不用 minimum width(撑大)\node[fit=(a)(b)(c), draw, rounded corners] {}; % zone 自动包住内容
\node[box, text width=3.2cm, align=center] {长标签会换行不会溢出};
% ❌ minimum width=3.2cm → 长标签把框横向撑大、顶破 zone
text width 让超长内容换行(保持框宽),minimum width 让框长出去(溢出邻居)。
前者把"碰撞 bug"(硬,必修)降级成"挤一点"(软,审美)。
\coordinate (c) at ($(first.north west)!0.5!(last.north east)$);
\node[anchor=south] at ($(c)+(0,0.5)$) {标题}; % 行变宽,标题自动跟着居中
references/hard-constraints.md 看全)最高频的几条(很多是 CJK / xelatex 静默坑):
rotate=90 → 渲成不可读色块。所有中文标注必须水平。\texttt{…中文…} → 报错。\texttt 只包纯英文代码。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。-{Stealth[scale=X]})用预定义 style,只调 line width(0.6/1.0/1.6pt 三档),tip 自动跟随。详见
../thesis-figure-skill/references/tikz-template.tex 的 6 个 canonical styles。铁律:
arrow short(tip 3pt),否则默认 6.5pt tip 把 stem 吃光 = "只剩个头"。fan_stub(shorten <=0pt,紧贴 spine 无 gap),不用 arrow。\usetikzlibrary{bending} 必加载。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 全盲,只有看图才发现。
| 你要做的 | 用 |
|---|---|
| 写/审任何 TikZ 图代码、修排版/对齐/溢出/箭头 bug、CJK 渲染问题 | 本技能 |
| 把论文文案/参考图变成成品配图(设计 + 编排 + 视觉迭代 + skeleton 复用) | thesis-figure-skill(它在代码正确性层 compose 本技能) |
thesis-figure-skill 的 6 个 example-skeleton-*.tex 已全部按这 5 条 idiom 重写,是本技能最好的 worked examples。
| 触发 | 文件 |
|---|---|
| 要看 5 idiom 的完整代码模式 | references/by-construction.md |
| 要看全部 8 条硬约束 + 修法 | references/hard-constraints.md |
| 要对照 before/after | references/examples/(BAD vs GOOD + 编辑安全证明图) |
| 要跑静态检查 | references/lint.sh(执行即可,不用 Read) |
Build Shopify applications, extensions, and themes using GraphQL/REST APIs, Shopify CLI, Polaris UI components, and Liquid templating. Capabilities include app development with OAuth authentication, checkout UI extensions for customizing checkout flow, admin UI extensions for dashboard integration, POS extensions for retail, theme development with Liquid, webhook management, billing API integration, product/order/customer management. Use when building Shopify apps, implementing checkout customizations, creating admin interfaces, developing themes, integrating payment processing, managing store data via APIs, or extending Shopify functionality.
Develops custom WordPress themes and plugins, creates and registers Gutenberg blocks and block patterns, configures WooCommerce stores, implements WordPress REST API endpoints, applies security hardening (nonces, sanitization, escaping, capability checks), and optimizes performance through caching and query tuning. Use when building WordPress themes, writing plugins, customizing Gutenberg blocks, extending WooCommerce, working with ACF, using the WordPress REST API, applying hooks and filters, or improving WordPress performance and security.
在 Swift 中使用 actor 实现线程安全的数据持久化——基于内存缓存与文件支持的存储,通过设计消除数据竞争。
| 当系统提示需要防御提示注入、越狱攻击、社会工程、内容信任边界突破等安全威胁时调用此 Skill。适用于构建 AI Agent、聊天机器人、文档处理助手等任何接受外部输入的系统提示。不适用于纯内部工具调用场景或已完全隔离的沙箱环境,也不适用于 UI 布局或响应格式设计。
| 当需要为 AI 设计记忆存储、检索、应用和更新机制时调用此 skill。典型场景包括:设计持久化记忆架构(用户偏好、历史上下文、项目知识)、定义记忆的创建/读取/更新/删除生命周期、实现静默记忆应用(不在回复中透露记忆内容)、管理敏感记忆边界。 不适用于:定义工具接口(tool-specification)、定义安全规则(safety-guardrails)、定义人格风格(personality-system)。 关键 trigger 信号:AI 需要跨会话记住用户信息、记忆内容可能敏感、需要在回复中隐式应用记忆而非显式引用、用户要求"记住这个"。
| 当系统提示词需要为 AI 输出定义格式规范、长度约束、风格指南或反"AI味"策略时调用此 Skill。适用于聊天机器人、CLI 工具、移动端助手、设计生成器等需要自适应输出的场景。不适用于:纯内容生成(无格式要求)、内部推理链设计、安全策略制定。当需求仅涉及"用什么格式返回数据"而非"如何控制输出的风格与密度"时,这不是最佳 Skill。
| 当需要在基础身份之上叠加可切换的人格风格层时调用此 skill。典型场景包括:为同一产品提供多种人格选项(如 GPT-5.1 的 friendly/professional/quirky 模式)、设计人格切换机制、防止人格泄露到用户内容中。 不适用于:定义 AI 的核心角色定位(应使用 persona-design)、设计安全规则(应使用 safety-guardrails)。 关键 trigger 信号:产品需要多种语气风格、用户可切换 AI 性格、需要防止 AI 人格污染用户文本、存在 "personality" 或 "tone" 配置项。
| 当需要为 AI 系统设计多层安全防线、内容过滤策略和伦理边界时调用此 skill。典型场景包括:设计拒绝策略与升级机制、防御 prompt 注入攻击、实现领域特定安全规则(教育、医疗、金融等)、定义 AI 的价值观锚点。 不适用于:定义工具操作权限(应使用 tool-specification)、定义 AI 身份(persona-design)、调整输出风格(personality-system)。 关键 trigger 信号:AI 涉及敏感话题、需要设计"拒绝回答"策略、存在 prompt 注入风险、特定行业合规要求、需要多层防御而非单一规则。
Take 0xe1337/tikz-figure-code from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.