Template:图书排版/doc:修订间差异

删除的内容 添加的内容
修正文档格式:把 Markdown 的 **粗体** 修正为 MediaWiki 的 '''粗体'''
以 heti 官方规则为底补齐版式类,并把版式改为模板参数开关({{图书排版|行间注}} 等)
 
(未显示2个用户的32个中间版本)
第3行:
 
== 用法 ==
在页面'''顶部'''引入模板、在正文'''结束处闭合容器'''(153 个既有页面均已如此):
在页面顶部引用:
 
<pre>
<nowiki>{{</nowiki>图书排版<nowiki>}}</nowiki>
 
(正文……)
 
<nowiki>{{图书排版/尾}}</nowiki>
</pre>
 
'''头部与尾部必须成对。''' 头部模板总是输出一个基础容器 <code>&lt;div class="tushu-body"&gt;</code>(不传参数时也一样,只是不带版式类),闭合靠 <code>{{tl|图书排版/尾}}</code> 或文末手写 <code>&lt;/div&gt;</code>。
 
* 漏写尾部'''不会报错''',但容器会自动延伸到页面末尾,把后续章节与页尾导航一并包进版式里。
* 尾部应放在 <code>----</code> 与 <code>&lt;references /&gt;</code> '''之上''',使参考资料节留在容器内、页尾导航与分类留在容器外。
 
样式'''只作用于正文段落与标题''':
* 段落 <code>&lt;p&gt;</code>:字号、行高、字距、首行缩进、两端对齐、断行规则
* 标题 <code>&lt;h1&gt;</code>–<code>&lt;h6&gt;</code>:字号阶梯、行高、字距、字重
* <code>&lt;ruby&gt;</code> / <code>&lt;rt&gt;</code>:行间注注音
 
表格、列表、链接、引用、代码块、<code>mark</code>/<code>q</code>/<code>sup</code>/<code>sub</code> 等元素'''不受影响'''——导航框、目录表、信息框的版式不会被改动。
第17行 ⟶ 第26行:
== 默认排版效果 ==
 
=== 字体分派:中文 / 西文 / 标点 ===
正文字体栈按「西文 → 黑体 → 宋体 → 扩展区」的顺序回退:
样式用两个 <code>@font-face</code> 配 <code>unicode-range</code>,把不同码位分给不同字体:
 
{| class="wikitable"
! 字符范围 !! 实际字体 !! 说明
|-
| 拉丁字母、数字(ASCII) || GeorgiaVerdana 等/ Arial(黑体栈的西文字体) || 保留原有西文观感
|-
| 汉字、假名等 CJK || '''PingFang SC / Microsoft YaHei'''(黑体栈) → Hiragino Sans GB → NotoSimSun Serif→ SCSimSun-ExtB/G → Microsoft YaHei UIJigmo → …HanaMin || 沿用站点原有黑体优先级,汉屏幕阅读舒适;生僻字外观不变自动往后掉到扩展区字体。繁体视图由 <code>:lang(zh-hant)</code> 换成繁体系(苹方 TC / 微軟正黑體)
|-
| 标点(<code>,。、:;!?()“”《》「」</code>) || 跟随正文字体(上两行同源) || 2026-09 起不再单独指定字体;引号字形随各字体而异
| 中文标点(引号、破折号、顿号、书名号等) || Noto Serif SC → Source Han Serif SC → Songti SC → SimSun(宋体类) || 标点占满一个全角字身,两侧留白正常
|}
 
'''为什么标点要单独处理:'''全角引号 <code>“ ”</code> 的码位是 U+201C / U+201D,Georgia、苹方、微软雅黑都含这两个字形,且做成'''西文风格的窄引号'''——此前因此出现「引号与后一个字贴在一起」。现在标点固定交给宋体类全角字体,任何设备上都不会再贴字。
 
=== 字号阶梯 ===
第36行 ⟶ 第43行:
! 元素 !! 字号 !! 行高
|-
| <code>&lt;h1&gt;</code> || 32px<code>2.25rem</code>(36px) || 48px<code>1.4</code>
|-
| <code>&lt;h2&gt;</code> || 24px<code>1.875rem</code>(30px) || 36px<code>1.4</code>
|-
| <code>&lt;h3&gt;</code> || 20px<code>1.625rem</code>(26px) || 36px<code>1.4</code>
|-
| <code>&lt;h4&gt;</code> || 18px<code>1.5rem</code>(24px) || 24px<code>1.4</code>
|-
| <code>&lt;h5&gt;</code> || 16px<code>1.375rem</code>(22px) || 24px<code>1.4</code>
|-
| <code>&lt;h6&gt;</code> || 14px<code>1.25rem</code>(20px) || 24px<code>1.4</code>
|-
| 正文 <code>&lt;p&gt;</code> || 16px<code>1.25rem</code>(20px) || 1.5<code>2</code>
|}
 
'''单位策略''':'''正文与标题用 <code>rem</code>'''——相对根字号(<code>html { font-size: 100% }</code> = 16px),嵌套时不会叠乘,与 MediaWiki 的 <code>--font-size-medium</code> 做法一致;'''辅助类字号用 <code>em</code>'''——相对所在元素的字号,随环境自动缩放。
 
=== 段落与对齐 ===
* 字距号 <code>1.02em25rem</code>(标题= h1–h3 为 <code>.05em</code>)20px)
* 段距:不自行声明,用站点默认(<code>.mw-body p</code> 为 <code>0.5em</code> 上 / <code>1em</code> 下)
* 首行缩进 <code>2em</code>
* 两端对齐 <code>text-align: justify</code>
* 行高 <code>2</code>;标题行高 <code>1.4</code>
* 非中文段落自动左对齐、取消缩进
* 长串西文自动断行(<code>overflow-wrap</code> / <code>hyphens</code>)
第65行 ⟶ 第76行:
岁乙未,吾邑疫疠大作,予家臧获率六七就枕席。予曰:“吾闻是书于家大夫之日久矣,而书肆间绝不可得。”君曰:“予诚有之。”Latin check: Georgia ABC abc 0123 — “quoted latin”。
 
== 可选版式(需加 class)模板参数) ==
下列版式默认不生效,需要把内容包进;给模板传参数即可打开对应 class 的容器里;可叠加使用(英文别名等效)。
 
参数可以'''叠加'''——多写几个,类名会拼在同一个容器上,两种版式同时生效:<code><nowiki>{{图书排版|诗词|限宽}}</nowiki></code> → <code>&lt;div class="heti--poetry heti--line-length"&gt;</code>。
=== 古籍体 <code>heti--ancient</code> ===
标题居中、正文宋体,适合序跋。
<pre>
&lt;div class="heti heti--ancient"&gt;
(正文)
&lt;/div&gt;
</pre>
<div class="heti heti--ancient">
'''刻《仲景全书》序'''
予曰:“吾闻是书于家大夫之日久矣,而书肆间绝不可得。”君曰:“予诚有之。”
</div>
 
{| class="wikitable"
=== 诗词体 <code>heti--poetry</code> ===
! 参数 !! 英文别名 !! 容器类 !! 效果
|-
| <code>诗词</code> || <code>poetry</code> || <code>heti--poetry</code> || 居中、不缩进
|-
| <code>限宽</code> || <code>line-length</code> || <code>heti--line-length</code> || 正文限宽 42em 并居中
|-
| <code>双栏</code> || <code>columns-2</code> || <code>heti--columns-2</code> || 两栏(栏目数固定为 2)
|}
 
=== 诗词体(参数 <code>诗词</code>) ===
正文居中、不缩进,适合诗词、铭文。
<pre>
<nowiki>{{图书排版|诗词}}</nowiki>
&lt;div class="heti heti--poetry"&gt;
 
&lt;p&gt;床前明月光,疑是地上霜。&lt;/p&gt;
(诗句,每句之间空一行)
&lt;/div&gt;
 
<nowiki>{{图书排版/尾}}</nowiki>
</pre>
{{图书排版|诗词}}
<div class="heti heti--poetry">
'''静夜思'''
<p>床前明月光,疑是地上霜。</p>
<p>举头望明月,低头思故乡。</p>
{{图书排版/尾}}
</div>
 
=== 分栏诗词(推荐配 <code>&lt;poem&gt;</code>) ===
Poem 扩展的 <code>&lt;poem&gt;</code> 负责把换行变成 <code>&lt;br&gt;</code>(因此诗句'''不必每句空行'''),<code>|双栏</code> 负责分栏并把诗句改为左对齐(<code>|诗词|双栏</code> 组合与参数顺序无关)。诗词名与作者放在分栏容器'''之外''',只有诗块参与分栏。
 
=== 竖排 <code>heti--vertical</code> ===
自上而下、右起排列,适合牌记、题签。
<pre>
<nowiki>{{图书排版|诗词|双栏}}</nowiki>
&lt;div class="heti heti--vertical"&gt;
 
&lt;p&gt;岁乙未,吾邑疫疠大作。&lt;/p&gt;
==静夜思==
&lt;/div&gt;
 
——唐·李白
 
<nowiki><poem></nowiki>
床前明月光
疑是地上霜
举头望明月
低头思故乡
<nowiki></poem></nowiki>
 
<nowiki>{{图书排版/尾}}</nowiki>
</pre>
<div class="heti heti--vertical">
<p>岁乙未,吾邑疫疠大作,予家臧获率六七就枕席。</p>
</div>
 
该组合也可手写为 <code>&lt;div class="heti--poetry heti--columns-2"&gt;</code>(与 <code>|诗词|双栏</code> 等价,参数顺序无关)。
=== 行间注 <code>heti--annotation</code> ===
注意 <code>|双栏</code> 自带 <code>max-width: none</code>(多栏需要宽度),'''不要再叠加 <code>|限宽</code>'''。
行距放大到 2.25,便于行间标注;<code>&lt;em&gt;</code> 自动变成着重号(字下点)。
 
用法(尾部可选,见[[#容器与闭合]]):
<pre>
<nowiki>{{图书排版|诗词}}</nowiki>
&lt;div class="heti heti--annotation"&gt;
(正文)
&lt;p&gt;…正文&lt;em&gt;需着重的字&lt;/em&gt;…&lt;/p&gt;
<nowiki>{{图书排版/尾}}</nowiki>
&lt;/div&gt;
</pre>
下方各节仍可用手写 class 的方式实现同样效果。
<div class="heti heti--annotation">
<p>予读而知其为<em>成无己</em>所解之书也。然而鱼亥不可正,句读不可离矣。</p>
</div>
 
=== 多栏(参数 <code>heti--columns-2</code> / <code>heti--columns-3双栏</code>) ===
把正文排成多两栏;也可用。注意'''不要叠加 <code>heti--columns-16em|限宽</code> 到'''——多栏自带 <code>hetimax--columns-48emwidth: none</code> 指定(分栏需要宽度),限宽 42em 再分两栏每栏只剩约 350px。
<pre>
<nowiki>{{图书排版|双栏}}</nowiki>
&lt;div class="heti heti--columns-2"&gt;
 
&lt;p&gt;(较长的正文)&lt;/p&gt;
(较长的正文)
&lt;/div&gt;
 
<nowiki>{{图书排版/尾}}</nowiki>
</pre>
{{图书排版|双栏}}
<div class="heti heti--columns-2">
<p>予曰:“吾闻是书于家大夫之日久矣,而书肆间绝不可得。”君曰:“予诚有之。”吾吴和缓明卿沈君南昉在海虞,藉其力而起死亡殆徧,予家得大造于沈君矣。不知沈君操何术而若斯之神,因询之。</p>
{{图书排版/尾}}
</div>
 
=== 字体族切换 ===
第130行 ⟶ 第154行:
! class !! 中文字体
|-
| <code>heti--heisong</code> / <code>heti--serif</code>(默认) || 黑宋体(PingFang(Songti SC / Microsoft YaHei UI)SimSun)
|-
| <code>heti--song</code> / <code>heti--serif</code> / <code>heti--classic</code> || 宋体(Songti SC / SimSun)
|-
| <code>heti--kai</code> || 楷体(Kaiti SC / STKaiti / KaiTi)
|}
字体族类是这套样式里'''没有模板参数入口'''的,需要时这样手写。注意'''只写这一个类名''',不要写成 <code>class="heti heti--song"</code>——本站'''没有引入''' heti 的 <code>.heti</code> 容器类。
<div class="heti heti--song">
<div class="heti--song">
<p>宋体示例:予曰:“吾闻是书于家大夫之日久矣。”</p>
</div>
<div class="heti heti--kai">
<p>楷体示例:予曰:“吾闻是书于家大夫之日久矣。”</p>
</div>
 
=== 辅助类速查作用范围与限制 ===
* 只影响 <code>p</code>、<code>h1</code>–<code>h6</code> 与各版式容器;其余标签一律不碰。
{| class="wikitable"
* 段落规则会命中'''模板输出里的 p'''(少数模板会生成段落),影响很小但存在。
! class !! 用途
* 纸色背景 <code>#f6f4f0</code> 需要选中内容容器自身,TemplateStyles 无法做到,需站点级 CSS。
|-
* 未引入 heti 的 JavaScript 增强(中西文自动间距、标点挤压):需要改站点 JS,且其挤压方向与「标点要有留白」相反。
| <code>heti-meta</code> || 落款、副题(块级、不缩进)
|-
| <code>heti-verse</code> || 诗句(居中、不缩进)
|-
| <code>heti-large</code> / <code>heti-x-large</code> / <code>heti-small</code> / <code>heti-x-small</code> || 字号微调 18px / 20px / 14px / 12px
|-
| <code>heti-fn</code> || 文末注释区
|-
| <code>heti-hang</code> || 悬挂缩进
|-
| <code>heti-em</code> || 着重号(字下点)
|-
| <code>heti-ruby--inline</code> || 行内 ruby 紧凑排版
|-
| <code>heti-list-latin</code> / <code>heti-list-han</code> || 列表编号:拉丁字母 / 汉字(一二三…)
|}
 
== 容器与闭合 ==
== 行间注(注音 / 训诂) ==
<code><nowiki>{{图书排版}}</nowiki></code> 会输出一个基础容器 <code>&lt;div class="tushu-body"&gt;</code>,正文限宽(42em + 居中)就挂在这个容器上——容器继承正文字号,因此 <code>em</code> 的基准就是正文,标题与段落因而同宽对齐。(若把 <code>max-width</code> 分别写在 <code>p</code> 与 <code>h1</code>–<code>h6</code> 上,<code>em</code> 会按各元素自身字号计算,h1 的 42em 宽达 1344px,标题反而无法与正文对齐。)
styles.css 自 2026-09 起支持 '''HTML ruby 行间注''',注文显示在字上方小字,无需任何扩展,在 wikitext 里直接写:
<pre>
&lt;ruby&gt;被注字&lt;rt&gt;pīn yīn&lt;/rt&gt;&lt;/ruby&gt;
</pre>
上方注文默认 0.55em 小字;若整段都要注音,建议配合上面的行间注版式(行距 2.25)使用。
 
'''写上 <code><nowiki>{{图书排版/尾}}</nowiki></code> 显式闭合'''(等价于手写 <code>&lt;/div&gt;</code>)。153 个既有页面均已如此。
示例:注音与行间注渲染效果如下
 
'''尾部应放在 <code>----</code> 与 <code>&lt;references /&gt;</code> 之上''',这样参考资料节留在容器内,而页尾导航、目录、分类留在容器外。若两者都不存在,则放在 <code><nowiki>{{daohang-f}}</nowiki></code> 之上。
<div class="heti heti--annotation">
吾邑<ruby>疫<rt>yì</rt></ruby>疠大作,予家<ruby>臧<rt>zāng</rt></ruby>获<ruby>率<rt>shuài</rt></ruby>六七就枕席。
</div>
 
若不写尾部,容器会由 HTML5 解析器自动闭合到内容区末尾:页面不会报错,但页末的导航、目录也会被一并限宽。
== 作用范围与限制 ==
* 传了版式参数也一样:容器始终只有一个,参数是它的附加类,例如 <code>class="tushu-body heti--poetry"</code>。
* 只影响 <code>p</code>、<code>h1</code>–<code>h6</code>、<code>ruby</code>;其余标签一律不碰。
* 本版式仅用于'''页面正文内容''';本站阅读器(Gadget BookVerticalReader)是独立的书籍阅读器,与本模板的版式开关无关。
* 段落规则会命中'''模板输出里的 p'''(少数模板会生成段落),影响很小但存在。
* 版式类名沿用 heti([https://github.com/sivan/heti sivan/heti])的官方命名;本站样式表以 heti 官方规则为底、按需补齐,全部内容都在 [[Template:图书排版/styles.css]] 内,'''不加载任何外部 heti 文件'''。
* 纸色背景 <code>#f6f4f0</code> 需要选中内容容器自身,TemplateStyles 无法做到,需站点级 CSS。
* 未引入 heti 的 JavaScript 增强(中西文自动间距、标点挤压):需要改站点 JS,且其挤压方向与「标点要有留白」相反。
 
== 繁体(zh-Hant)的字体 ==
== 注意事项 ==
简体视图正文用黑体栈(苹方 SC → 微软雅黑 → …);繁体视图由 <code>:lang(zh-hant)</code> 规则改用繁体系字体栈(苹方 TC → '''微軟正黑體''' → 思源黑體 TC → 明體 → …),与站内 Vector 皮肤一致。两套栈只在中文段不同:西文、标点(<code>@font-face</code>)与扩展区兜底(<code>SimSun-ExtB</code>/<code>SimSun-ExtG</code>/<code>Jigmo</code>/<code>HanaMin</code>)相同。
* 一个 <code>&lt;ruby&gt;</code> 只注一音,要注多义请按需拆开显示。
* 行间注版式仅用于'''页面正文内容''';本站阅读器(Gadget BookVerticalReader)是独立的书籍阅读器,与本模板的行间注功能无关。
* 可选版式的 class 名沿用 <code>heti--*</code> 命名(来自中文排版方案 heti),但本站'''不依赖任何 heti 文件''',全部样式都在 [[Template:图书排版/styles.css]] 内。
 
== 参见 ==