<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>中文 · 此间札记</title><description>带有「中文」标签的文章订阅。</description><link>https://xiaoxusop.github.io/letterpress/</link><language>zh-CN</language><copyright>© XIAOXUsop</copyright><atom:link href="https://xiaoxusop.github.io/letterpress/tags/%E4%B8%AD%E6%96%87/rss.xml" rel="self" type="application/rss+xml"/><item><title>中文网页排版，多数主题都做错了</title><link>https://xiaoxusop.github.io/letterpress/cjk-web-typography/</link><guid isPermaLink="true">https://xiaoxusop.github.io/letterpress/cjk-web-typography/</guid><description>行高、字重、行宽、中西文间距——这四个参数直接套西文的值，中文读者看到的是一份「能读但别扭」的页面。2026 年有三个原生 CSS 属性可以修好其中一半。</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;中文网页排版有个奇怪的现象：&lt;strong&gt;大家都觉得别扭，但很少有人能指出哪里别扭。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原因多半是这四个参数被直接沿用了西文的值。它们单独看都不致命，
叠在一起就是那种说不清的「不对劲」。&lt;/p&gt;
&lt;h2 id=&quot;一行高&quot;&gt;一、行高&lt;a class=&quot;heading-anchor&quot; href=&quot;#一行高&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;西文正文的常用行高是 1.4 到 1.5。这个值搬到中文上会显得挤。&lt;/p&gt;
&lt;p&gt;因为汉字是&lt;strong&gt;方块字&lt;/strong&gt;：笔画在字面内铺得很满，字与字之间没有西文那种
由升降部带来的天然空隙。同样行高下，中文的行间留白视觉上更少。&lt;/p&gt;
&lt;p&gt;中文正文的行高应当在 &lt;strong&gt;1.6 到 1.8&lt;/strong&gt; 之间。本站用的是 1.75。&lt;/p&gt;
&lt;p&gt;还有个细节：行高要用&lt;strong&gt;无单位数值&lt;/strong&gt;（&lt;code&gt;line-height: 1.75&lt;/code&gt;），不要用 &lt;code&gt;px&lt;/code&gt; 或 &lt;code&gt;em&lt;/code&gt;。
无单位值是相对于元素自身字号计算的，继承时不会出乱子。&lt;/p&gt;
&lt;h2 id=&quot;二字重&quot;&gt;二、字重&lt;a class=&quot;heading-anchor&quot; href=&quot;#二字重&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这条最容易被忽略，但效果立竿见影。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;很多中文字体只有两个真实字重：400 和 700。&lt;/strong&gt; 苹方有 Ultralight 到 Semibold，
思源黑体有 300 到 900 的完整字重；微软雅黑主要就是 400 和 700。
（Apple 官方系统字体清单里列有 &lt;code&gt;PingFang SC Semibold&lt;/code&gt;，
见 &lt;a href=&quot;https://developer.apple.com/fonts/system-fonts/&quot;&gt;System Fonts&lt;/a&gt;。）&lt;/p&gt;
&lt;p&gt;这里的通行说法是「写 600 会触发伪合成，所以只能写 500」。&lt;strong&gt;这话只说对了一半。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;伪合成的开关不是字重数值，而是 &lt;strong&gt;&lt;code&gt;font-synthesis-weight&lt;/code&gt;&lt;/strong&gt;。至于字重本身——
写一个字体没有的字重时，规范要求的是&lt;strong&gt;去找最接近的真实字重&lt;/strong&gt;，不是伪造一个：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When a weight is specified for which no face exists, a face with a
nearby weight is used.
—— &lt;a href=&quot;https://www.w3.org/TR/2026/WD-css-fonts-4-20260913/#font-style-matching&quot;&gt;CSS Fonts Level 4 §2.2.2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;「最接近」具体朝哪边找，规范给了确定规则&lt;/strong&gt;（§5 字重匹配）：
请求的字重&lt;strong&gt;大于 500&lt;/strong&gt; 时，先按升序检查&lt;strong&gt;不小于&lt;/strong&gt;目标的字重
（600 → 700 → 800 → 900），都找不到再向下找。于是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;苹方这类&lt;strong&gt;确有 600&lt;/strong&gt; 的字体 → 请求 600 &lt;strong&gt;直接命中 600&lt;/strong&gt;，不会跳到 700；&lt;/li&gt;
&lt;li&gt;微软雅黑这类&lt;strong&gt;只有 400/700&lt;/strong&gt; 的字体 → 请求 600 先查 700，&lt;strong&gt;落到 700&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两条路径&lt;strong&gt;都不会伪造粗体&lt;/strong&gt;（前提是没开伪合成）：开着合成时它才会把 400
算法加粗——笔画发虚、字形走样，而且每个浏览器合成得还不一样。&lt;/p&gt;
&lt;p&gt;本站的做法是把合成直接关掉：&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;  font-synthesis-weight&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是标题可以写 &lt;code&gt;font-weight: 600&lt;/code&gt;：拉丁部分拿到 Archivo 的真实 600，
中文部分落到&lt;strong&gt;自己字体里最接近 600 的真实字重&lt;/strong&gt;（苹方约 600、雅黑 700），
两者视觉重量相当。
（反过来，写 500 的话中文更容易掉到 &lt;strong&gt;400&lt;/strong&gt;——比正文还轻，标题反而立不住。）&lt;/p&gt;
&lt;p&gt;更重要的是：&lt;strong&gt;层级主要靠字号和颜色建立，不要靠字重硬拉。&lt;/strong&gt;
一段 17px/400 的正文和一段 21px/600 的小标题，层级已经足够了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;勘误（2026-09-22）&lt;/strong&gt;：这一节原先写的是「正确做法：标题字重写 500，
让字体自己去挑最接近的真实字重」。&lt;strong&gt;结论和建议都改掉了&lt;/strong&gt;：把伪合成归因到
字重数值本身是错的——开关是 &lt;code&gt;font-synthesis-weight&lt;/code&gt;；而在关掉合成的实现里，
写 500 会让中文落到 400，比 600 更糟。
依据见 &lt;a href=&quot;https://www.w3.org/TR/2026/WD-css-fonts-4-20260913/#font-style-matching&quot;&gt;CSS Fonts Level 4 的字重匹配&lt;/a&gt;
与本站 &lt;code&gt;src/styles/base.css&lt;/code&gt; 的 &lt;code&gt;font-synthesis-weight&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;三行宽&quot;&gt;三、行宽&lt;a class=&quot;heading-anchor&quot; href=&quot;#三行宽&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这是四个里最麻烦的一个，因为中西文的最优值&lt;strong&gt;在同一个单位下对不齐&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;西文的理想行宽是 45 到 75 个字符，66 是经典值。而 &lt;code&gt;ch&lt;/code&gt; 这个单位
是为西文设计的——按规范，它等于&lt;strong&gt;渲染所用字体&lt;/strong&gt;里「0」字形的宽度：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;ch&lt;/code&gt; — Represents the typical advance measure of &lt;strong&gt;European&lt;/strong&gt; alphanumeric
characters, and measured as the used advance measure of the “0” (ZERO,
U+0030) glyph &lt;strong&gt;in the font used to render it&lt;/strong&gt;.
—— &lt;a href=&quot;https://www.w3.org/TR/2024/WD-css-values-4-20240312/#ch&quot;&gt;CSS Values and Units Level 4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;两个要点：它是&lt;strong&gt;欧洲字符&lt;/strong&gt;的度量，而且&lt;strong&gt;取决于字体&lt;/strong&gt;。所以 &lt;code&gt;ch&lt;/code&gt; 换算不出一个
跨字体稳定的汉字数——换个字体，「66ch 能排几个汉字」这个数就变了。&lt;/p&gt;
&lt;p&gt;粗估的话，一个汉字约等于两个 &lt;code&gt;ch&lt;/code&gt;，66ch 大约排 &lt;strong&gt;33 个汉字&lt;/strong&gt;。
（顺带一提，这个数其实落在中文舒适的 30–40 字里——但它是粗估，且随字体浮动。）&lt;/p&gt;
&lt;p&gt;本站改用 &lt;code&gt;em&lt;/code&gt;，图的是&lt;strong&gt;可预测&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#6CB6FF&quot;&gt;.prose&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;  max-width&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;34&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;em&lt;/code&gt; 等于元素的字号，这是规范保证的，且&lt;strong&gt;不依赖字体&lt;/strong&gt;。
但「一个汉字正好 1em 宽」&lt;strong&gt;不是规范保证&lt;/strong&gt;——汉字的 advance 取决于具体字体，
规范为此专门定义了一个 &lt;code&gt;ic&lt;/code&gt; 单位来表示「字体中全角字形的典型 advance」，
并规定在无法确定时&lt;strong&gt;假设为 1em&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;ic&lt;/code&gt; unit is … a typically exact measure (in the few fonts with proportional
fullwidth glyphs, an approximation) of a single fullwidth glyph’s advance measure.
In the cases where it is impossible or impractical to determine the ideographic
advance measure, it must be assumed to be &lt;code&gt;1em&lt;/code&gt;.
—— &lt;a href=&quot;https://www.w3.org/TR/2024/WD-css-values-4-20240312/#ic&quot;&gt;CSS Values and Units Level 4 §5.1.1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;这一句本身就说明「容器宽度单位」和「实际字形宽度」不能混为一谈&lt;/strong&gt;——
如果规范能保证两者相等，就不必再定义 &lt;code&gt;ic&lt;/code&gt; 了。&lt;/p&gt;
&lt;p&gt;所以准确的说法是：34em 让内容栏宽度&lt;strong&gt;稳定地跟随字号&lt;/strong&gt;；
对常见全角汉字可&lt;strong&gt;近似&lt;/strong&gt;理解为约 34 字，但&lt;strong&gt;实际每行字数仍受字体、标点、
字距和混排影响&lt;/strong&gt;。于是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文：约 34 个字（近似，落在 30–40 的理想区间）✅&lt;/li&gt;
&lt;li&gt;西文：约 68 个字符（近似，落在 45–75 的理想区间）✅&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;一个值同时覆盖两种文字的舒适区，而且容器宽度不随字体变。&lt;/strong&gt; 这是
&lt;code&gt;--measure: 34em&lt;/code&gt; 的由来。&lt;strong&gt;注意被保证的是「宽度稳定」，不是「字数确定」。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;勘误（2026-09-22）&lt;/strong&gt;：这一节原先写的是「一个汉字大约等于两个 &lt;code&gt;ch&lt;/code&gt;，
所以按 66ch 排中文，每行会排出约 130 个汉字——远超出中文舒适的 30 到 40 字」。
&lt;strong&gt;两处都错&lt;/strong&gt;：按它自己的前提应当除以 2 得 33，而不是乘以 2 得 130；
而 33 本来就落在它自己说的舒适区间内，所以「远超」这个结论也不成立。&lt;/p&gt;
&lt;p&gt;这句话还遮住了一个更关键的事实：&lt;strong&gt;66ch ≈ 33em，与本题采用的 34em 宽度几乎相同&lt;/strong&gt;
（这一步依赖「0 字形约 0.5em」这个假设，是推算而非实测）。
也就是说这个改动换来的是&lt;strong&gt;容器宽度的可预测性&lt;/strong&gt;，不是行宽。
&lt;strong&gt;结论（用 em）不变，论证方式改了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;依据：&lt;a href=&quot;https://www.w3.org/TR/2024/WD-css-values-4-20240312/#ch&quot;&gt;CSS Values and Units Level 4 §ch&lt;/a&gt;、
&lt;a href=&quot;https://www.w3.org/TR/2024/WD-css-values-4-20240312/#ic&quot;&gt;§ic&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;勘误（2026-09-24）&lt;/strong&gt;：上一条勘误之后，本节仍留着
「&lt;code&gt;em&lt;/code&gt; 等于字号、与字体无关。一个汉字约 1em 宽……&lt;strong&gt;而且不随字体变&lt;/strong&gt;」，
并据此把 &lt;code&gt;34em&lt;/code&gt; 说成确定的字数换算。&lt;strong&gt;前半句对，后半句越界了&lt;/strong&gt;：
规范保证的是 &lt;code&gt;em&lt;/code&gt; 等于&lt;strong&gt;计算后的 font-size&lt;/strong&gt;，
不保证&lt;strong&gt;每个汉字的 advance 恒等于 1em&lt;/strong&gt;——所以「34em ≈ 34 字」是近似，
而「&lt;strong&gt;每行字数确定&lt;/strong&gt;」这句话是不成立的。详见上面引的 &lt;code&gt;ic&lt;/code&gt; 那段。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;四中西文间距与标点&quot;&gt;四、中西文间距与标点&lt;a class=&quot;heading-anchor&quot; href=&quot;#四中西文间距与标点&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;中文和英文、数字之间应该有一个小间隙：「共 500 条记录」比「共500条记录」好读。&lt;/p&gt;
&lt;p&gt;过去这件事要靠 &lt;a href=&quot;https://github.com/vinta/pangu.js&quot;&gt;pangu.js&lt;/a&gt; 之类的库在
客户端跑一遍正则，找到边界然后插空格。它有一堆边缘情况（全角标点前后不加、
&lt;code&gt;90°&lt;/code&gt; 不加、&lt;code&gt;15%&lt;/code&gt; 不加），而且要在 DOM 加载后重写文本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026 年浏览器原生做了这件事：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;  text-autospace&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;normal&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;  text-spacing-trim&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: trim-start;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;text-autospace: normal&lt;/code&gt; 自动在中西文之间插入约 1/4 个空格。2025 年进入 Baseline。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;text-spacing-trim: trim-start&lt;/code&gt; 做中文标点的字距调整——行首的逗号句号
之类不再占满一格。Chrome / Edge 123+ 已默认开启。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两个前提：&lt;strong&gt;&lt;code&gt;&amp;#x3C;html lang&gt;&lt;/code&gt; 必须设置正确&lt;/strong&gt;，否则浏览器不会应用对应语言的规则；
代码块里要关掉自动间距，因为代码里的空格是有意义的：&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;pre&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;code&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;kbd&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;samp&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;text-autospace&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: no-autospace; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;只有 Chromium 系支持&lt;/strong&gt;：MDN 的浏览器兼容数据（2026-09-24 查）
记 Chrome 自 123 起支持，&lt;strong&gt;Safari 与 Firefox 均为「不支持」&lt;/strong&gt;——
&lt;code&gt;caniuse&lt;/code&gt; 上还没有这个特性（太新）。
所以它是&lt;strong&gt;渐进增强&lt;/strong&gt;——不支持的浏览器只是少了那一点调整，版式不会坏。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;本项目此前在这里写的是「全球覆盖约 72%」，现已删除。&lt;/strong&gt;
那个数字&lt;strong&gt;没有任何来源&lt;/strong&gt;（caniuse 抓不到、本项目也没实测过），
而它写在一个「实测」味道很重的段落里。
&lt;strong&gt;一个查不到来源的覆盖率，比不写更糟&lt;/strong&gt;——读者会以为它是量出来的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;五一条容易漏的中文没有斜体&quot;&gt;五、一条容易漏的：中文没有斜体&lt;a class=&quot;heading-anchor&quot; href=&quot;#五一条容易漏的中文没有斜体&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;中文字体不提供斜体字形。&lt;code&gt;font-style: italic&lt;/code&gt; 对中文的结果是浏览器
&lt;strong&gt;合成倾斜&lt;/strong&gt;——把笔画整体拉斜，字形变形、笔画糊在一起。&lt;/p&gt;
&lt;p&gt;而 CSS 没法问「这段 &lt;code&gt;&amp;#x3C;em&gt;&lt;/code&gt; 里是中文还是西文」。所以务实的选择是：
&lt;strong&gt;统一把强调处理成加粗&lt;/strong&gt;，这也是中文排版的通行做法。&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;  font-style&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;normal&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;600&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;六字体栈的顺序&quot;&gt;六、字体栈的顺序&lt;a class=&quot;heading-anchor&quot; href=&quot;#六字体栈的顺序&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最后一条，顺序不能反：&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;font-family&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;: &apos;Archivo&apos;, -apple-system, &apos;PingFang SC&apos;, &apos;Microsoft YaHei&apos;, &lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#8DDB8C&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;拉丁字体必须排在前面。&lt;/strong&gt; 如果中文字体排在前面，英文也会用中文字体渲染——
而中文字体里的拉丁字母是等宽的（为了和汉字对齐），排版上很难看。&lt;/p&gt;
&lt;p&gt;顺序对了之后，英文用 Archivo 渲染，汉字自动落到苹方/雅黑，各取所长。&lt;/p&gt;
&lt;h2 id=&quot;那要不要自托管中文字体&quot;&gt;那要不要自托管中文字体&lt;a class=&quot;heading-anchor&quot; href=&quot;#那要不要自托管中文字体&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;默认不要。&lt;/strong&gt; 中文字体单文件 5–20 MB，哪怕做了子集化，一个博客站也不该
为此付出首屏时间。而中文系统字体（苹方、微软雅黑、思源黑体）质量本身就很好——
知乎、Medium 中文版这类大站的内文都用系统字体。&lt;/p&gt;
&lt;p&gt;实在需要自定义时，用 &lt;a href=&quot;https://github.com/KonghaYao/cn-font-split&quot;&gt;cn-font-split&lt;/a&gt;
做子集化，并且务必用 &lt;code&gt;unicode-range&lt;/code&gt; 限定覆盖面。&lt;/p&gt;
&lt;h2 id=&quot;小结&quot;&gt;小结&lt;a class=&quot;heading-anchor&quot; href=&quot;#小结&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;table-wrap&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;可横向滚动的表格&quot; data-table-wrap=&quot;&quot;&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;西文常用&lt;/th&gt;&lt;th&gt;中文应用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;行高&lt;/td&gt;&lt;td&gt;1.4–1.5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.6–1.8&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;标题字重&lt;/td&gt;&lt;td&gt;600–700&lt;/td&gt;&lt;td&gt;&lt;strong&gt;600&lt;/strong&gt;（配 &lt;code&gt;font-synthesis-weight: none&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;行宽&lt;/td&gt;&lt;td&gt;66ch&lt;/td&gt;&lt;td&gt;&lt;strong&gt;34em&lt;/strong&gt;（≈34 汉字 / ≈68 西文字符，&lt;strong&gt;均为近似&lt;/strong&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;中西文间距&lt;/td&gt;&lt;td&gt;手动加&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;text-autospace&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;强调&lt;/td&gt;&lt;td&gt;斜体&lt;/td&gt;&lt;td&gt;&lt;strong&gt;加粗&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;这些细节单独看都很小。但它们同时出现时，读者的感受就是「这个站读起来舒服」
而说不出为什么——那正是排版该有的样子。&lt;/p&gt;
&lt;p&gt;相关条目：&lt;a href=&quot;/letterpress/wiki/cjk-typography/&quot;&gt;中文排版&lt;/a&gt;、&lt;a href=&quot;/letterpress/wiki/content-negotiation/&quot;&gt;内容协商&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;参考&quot;&gt;参考&lt;a class=&quot;heading-anchor&quot; href=&quot;#参考&quot; aria-label=&quot;此小节的永久链接&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2024/WD-css-values-4-20240312/#ch&quot;&gt;CSS Values and Units Level 4 §ch&lt;/a&gt; —— &lt;code&gt;ch&lt;/code&gt; 的定义
（W3C Working Draft, 12 March 2024）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2026/WD-css-fonts-4-20260913/#font-style-matching&quot;&gt;CSS Fonts Level 4 §2.2.2 Missing weights&lt;/a&gt; —— 缺少字重时如何匹配&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/2026/WD-css-fonts-4-20260913/#font-synthesis-weight&quot;&gt;CSS Fonts Level 4 §font-synthesis-weight&lt;/a&gt; —— 伪合成的开关
（W3C Working Draft, 13 September 2026）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;为什么链接带日期而不是 &lt;code&gt;/TR/css-values-4/&lt;/code&gt;&lt;/strong&gt;：后者是”最新版”，
会随规范修订移动——半年后回看，不知道当时引的是哪一版。
W3C 自己推荐的引用方式就是带日期的固定 URL。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;修订记录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-09-12&lt;/strong&gt; 发布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-22&lt;/strong&gt; 勘误：行宽一节把「一个汉字 ≈ 2 &lt;code&gt;ch&lt;/code&gt;」算反了（应除以 2 得 33，
原写作乘以 2 得 130），连带「远超舒适区」的结论也不成立；字重一节把伪合成
归因到字重数值上，而开关其实是 &lt;code&gt;font-synthesis-weight&lt;/code&gt;，且在关掉合成的实现里
写 500 会让中文落到 400。两处的&lt;strong&gt;结论都保持不变&lt;/strong&gt;（用 &lt;code&gt;em&lt;/code&gt;、标题用 600），
改的是论证与依据。同步修订了 &lt;a href=&quot;/letterpress/wiki/cjk-typography/&quot;&gt;中文排版&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-24&lt;/strong&gt; 勘误：上一轮只改了那句算错的算式，&lt;strong&gt;却留下了更大的越界&lt;/strong&gt;——
「&lt;code&gt;em&lt;/code&gt; 等于字号、与字体无关」被推广成「一个汉字正好 1em 宽、每行字数确定」。
规范保证的只是 &lt;code&gt;em&lt;/code&gt; 等于&lt;strong&gt;计算后的 font-size&lt;/strong&gt;；它为此专门定义了 &lt;code&gt;ic&lt;/code&gt;
来表示全角字形的典型 advance，无法确定时假设 1em。
同时&lt;strong&gt;苹方字重结论与 Apple 官方清单冲突&lt;/strong&gt;（清单里确有 &lt;code&gt;PingFang SC Semibold&lt;/code&gt;），
且「请求 600 必落 700」是条件句：匹配算法对 &gt;500 的请求&lt;strong&gt;先向上找&lt;/strong&gt;，
有真 600 的字体直接命中 600。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>排版</category><category>css</category><category>中文</category><author>XIAOXUsop</author></item></channel></rss>