文档
文档是按顺序阅读并打印在纸上的。这两个事实约束了布局:单一的文本列、真实的页面分隔,以及不依赖悬停的任何内容。
先决定分页方式
- 流动布局(默认)—— 一个连续的文本流;浏览器的打印引擎将其分页。适用于报告、备忘录、信件、论文等长度不固定的内容。
- 固定页面 —— 明确的
<section class="page">块,每页一张。适用于页面数量本身就是设计的场景:一页简历、双面传单、证书、海报。
如果用户要求“两页”,则意味着固定页面。如果用户要求“一份报告”,则意味着流动布局。当确实不明确时,请询问——构建错误的方式会浪费整个文档。
几何尺寸
在 <head> 中链接 token 文件,如果文档使用了其组件也链接 components.css,并使用其中的变量来设置颜色、字体和间距。以下规则仅适用于纸张几何尺寸:
@page { size: A4; margin: 0; } /* 或者:size: letter; */
body { margin: 0; background: white; }
.page { width: 210mm; min-height: 297mm; padding: 24mm 22mm; box-sizing: border-box; }
.page + .page { break-before: page; }
@media screen {
body { background: gainsboro; padding: 32px 0; }
.page { margin: 0 auto 24px; box-shadow: 0 2px 24px color-mix(in srgb, black 12%, transparent); }
}
对于流动文档,去掉固定的 .page,设置 @page { margin: 22mm } 并使用 max-width: 66ch 的列宽。纸张尺寸:除非用户明确是美国人则用 Letter,否则用 A4。如果用户提供了尺寸,则用他们的。
字体
- 正文 11–12pt,行高 1.5–1.6。对于任何需要阅读的内容,永远不要低于 10.5pt。
- 行宽 60–75 个字符。比这更宽,眼睛会失去对行的追踪。
- 正文用一种字体族,标题可选用第二种。如果存在设计系统,则与相同的配对保持一致。
- 标题按比例缩放,顶层标题明显更大——28–36pt——而不是 14pt 加粗。
- 强调通过字重和间距实现,而不是仅靠颜色。一份打印为灰度模式的文档仍然必须可读。
结构
- 使用真正的语义元素:
h1–h3、p、ul、table、figure、blockquote。不要用带样式的 div。 - 如果文档超过两页,通过
@page计数器添加页码:支持不完整——在每个固定页面上添加脚注样式的数字是一种可靠的备选方案。@page { @bottom-center { content: counter(page); } } - 表格:数字右对齐,文本左对齐,使用细线而非完整边框,通过
thead { display: table-header-group }在跨页时重复表头。 - 避免对超过页面三分之一高度的元素使用
break-inside: avoid。 - 图表需要带有说明文字。没有说明文字,就不要放图表。
内容
保留用户的原话。你可以在被要求时进行删减和重新排序;但不可以改写。如果一个章节是空的因为用户还没写,则留下一个明确标记的空白,而不是编造文本。
不要使用库存照片,也不要用仅作为装饰的生成图像。当文档需要真实图片时,如果 FLUX 工具可用则用其生成;否则使用一个占位框,其中用等宽字体注明该放置的内容。
收尾
以打印宽度运行 design-verify 并查看截图:
node ~/.config/opencode/lib/design/verify.mjs "design/Report.html" \
--width 900 --height 1200 --full --out design/.verify/report.png
检查:文本是否在页面边缘被裁剪、标题是否孤悬在页面底部、表格是否拆分不当、以及任何水平溢出——这在打印中意味着内容丢失在右边缘之外。
然后自己打印成 PDF 一次(Cmd-P,另存为 PDF),以确认页面数量以及在真实纸张大小下没有发生移位。