章 8 · 篇 II · 工艺
日文排版
Postext如何排日文横排与竖排:日本地区、禁则、约物间距、段首括号、竖排字形、振假名、傍点与傍线、汉文训读、编号、行取り标题、注释、五十音索引、引用、字体以及青空文库源文本
简单来说
本页说明Postext怎样排日文。日文书可以竖排成从右往左读的一列列文字,也可以像本页这样横排。语言设为日语的文档,按日文的规则断行、安排标点的空白、在字旁加小字读音和强调记号。本页还介绍注释、用汉字写的数字、占固定行数的标题、按读音排序的书后索引,以及怎样导入青空文库的文本。最后给出两套完整的示例配置,并列出尚未解决的问题。
日文页面在方形字格组成的网格上混排四种文字,标点的空白本身就是文字的一部分。
Postext用同一份Markdown源文件和同一套配置,既能横排日文,也能竖排日文。语言为日语的文档按禁则断行,给每个括号和逗号留出日文排版规定的空白,两个标点相遇时再收回这段空白;像大多数小说那样排段首的括号;小假名和竖排行中的标点使用竖排字形;振假名按1:2:1的比例排在汉字上方;被强调的词上方加芝麻点;章按第一章编号;索引按读音排序。从postext 1.16起,这一切都由locale: 'ja'推出;更早的版本用中国大陆的默认值排日文。本页说明引擎做了什么、由哪些设置控制。配置参考列出了每个键及其默认值,文档格式介绍了相关标记。
这些规则依据W3C的《日文排版需求》(Requirements for Japanese Text Layout,JLReq),下文按章节号引用;也依据JLReq所介绍的日本工业标准JIS X 4051。很多机制与中文共用,本页只是提到的部分,即字符网格、竖排页面转过的坐标系、右侧装订和各种输出,由中文排版详细说明。参考资料列在本页末尾。
#日本地区
locale为日语的文档(ja、ja-JP、ja-Jpan,大小写不限,用-或_都可以)采用cjk设置中的japan地区。于是每个保持'auto'的cjk字段都取日文惯例,注释、索引、引用和内置用词也是如此。也可以在任何文档中手动设置cjk.region: 'japan',按日文的规则排页面;这时内置用词以及注释、索引和引用的默认值仍跟随语言。沙盒文档语言下拉框所显示的列表DOCUMENT_LANGUAGES中,日本語排在各个中文条目和阿拉伯语之间。
#随语言区域变化的设置
| 设置 | 日本(ja) | 中国大陆(zh-Hans) |
|---|---|---|
断行(lineBreak) | ja-very-strict:小假名、ー、々和〜从不出现在行首 | gb |
标点宽度(punctuationWidth) | fullwidth,加上JLReq的相邻标点挤压;行尾的后括号类标点保留半个字宽,直到本行需要它 | kaiming |
段落中的?和!(spaceAfterQuestion) | 其后加一个字宽的空白 | 不加空白 |
段首的括号(paragraphStartBracket) | half:占缩进的后半个字宽 | 与一般行首相同 |
悬挂(hangingPunctuation) | allow,仅限、。,. | none |
*…*(emphasis、emphasisMark) | 文字上方加芝麻点,竖排时在右侧 | 文字下方加圆点 |
:book[…](bookTitleMark、bookTitleBrackets) | 『』,书名中的书名用「」 | 《》,书名中的书名用〈〉 |
割注的括号(warichu.open、close) | () | 无 |
注音(ruby.overhang、ruby.align) | 只伸到假名上,按1:2:1排 | 可伸到任何相邻字上,最多为注音字号的四分之一,居中 |
{漢字|かん|じ} | 熟语注音 | 单字注音 |
编号中的一 | japanese-informal:百一 | simp-chinese-informal:一百零一 |
| 竖排书中的注释 | 排在章末(後注),注码(1)在行的右侧 | 排在栏的下端 |
索引分组(index.groupBy) | 按读音分五十音行(あ行、か行…) | 拼音首字母 |
| 引用的语言区域 | ja-JP | zh-CN |
| 图、表、续表 | 図、表、(続き) | 图、表、(续) |
内置用词也是日文:交叉引用印作第3章、2.3節和12ページ,参考文献的标题是参考文献,拆开的表格或标注框写次ページへ続く,索引的符号组和数字组分别以記号和数字为组名,交叉引用用箭头写出(金之助 →夏目漱石,页码之后则是→夏目漱石、森鷗外も見よ),EPUB的导航名为目次、表紙、本文。字符串表中没有日文条目时,给出的是英文,而不是中文。图和表按章编号(図1-1),captionStyle: { labelNumberGap: '', labelSeparator: ' ' }把题注排成図1-1 東京の地図。和所有CJK文档一样,断词默认关闭,除非你为其中的拉丁单词打开它。
各种输出也声明同一个标签:HTML文档及其每一页都带lang="ja",Canvas用ctx.lang绘制,PDF声明/Lang (ja)并用日文字形整形(见字体)。Unicode只给直、骨和角各一个码位,日文字体和中文字体的写法却不同。
#汉字、假名与罗马字
一行日文里有汉字、平假名、片假名,还有拉丁字母和数字,即罗马字。Postext不需要任何设置来区分它们:CJK字符(汉字和假名都算)多于词间空格的段落由CJK排版器逐字排版,其中的拉丁单词或数字是一个单元,行不会在单元内部断开。日文与拉丁文字之间,排版器加四分之一个字宽(cjk.latinSpacing),两端对齐的行可以把它拉宽到半个字宽(JLReq §3.2.2);作者在那里输入的空格会被它替换,而不是叠加。日文正文的词与词之间没有空格,所以两个日文词之间输入的空格仍是空格。
修订黑本式拼写的罗马字带长音符号(Tōkyō、Sōseki),字体必须有这些字形:Postext不会向另一个字体族借缺少的字形。其他语言的词可以用隔离标记标注,:ltr[the Meiji era]{lang=en}:HTML把它标为lang="en",PDF把它放进带自己/Lang的/Span,并按该语言的字形整形。全角字母和数字(K、12)是日文字符:竖排时直立,各占一个字宽。
图书不用半角片假名(カタカナ);请写全角形式,或者交给青空文库转换器转换。波浪号〜(U+301C)以及Windows文本中代替它的全角波浪号~(U+FF5E),都按日文的连接号类处理。
#日文章节的Markdown写法
日文和其他语言一样用Markdown书写,中文章节的便利之处也都适用:
- 可以在任意位置换行。 两个日文字符之间的换行会被去掉,所以编辑器可以按任意宽度自动换行。
- 用配置来缩进。 日文段落缩进一个字:
bodyText.firstLineIndent: { value: 1, unit: 'em' }。解析器会去掉段首的全角空格(U+3000),所以带全角空格输入的源文件和不带的缩进相同。 - 标记用半角输入。 日文输入法会打出
:::、#和[^1];它们会作为正文印出来,构建时每一行都会报fullwidthMarkup,并给出应输入的半角形式。属性值可以用「…」加引号。 - ID和文件名保留假名和汉字,包括浊音符号:标题为がっこう的章就用这个名字保存。
#横排
本节的每条规则在竖排行中同样适用;下一节补充竖排时的变化。排版器就是中文所用的那个(见中文排版 › 横排);JLReq与clreq不同的地方,由日本地区改变其规则。
#断行(禁则)
禁则处理(禁則処理)规定哪些字符不能出现在行首、哪些不能出现在行尾。cjk.lineBreak有三个日文级别,对应JLReq附录C.3的三种惯例;中文的级别仍然可用。
| 级别 | 不能出现在行首 | 使用场合 |
|---|---|---|
ja-very-strict | 后括号和后引号」』)〕】;、,。.;连接号‐ – ゠ 〜 ~;?!‼⁇⁈⁉;・:;;叠字符ゝゞヽヾ〻和々;长音符ー;小假名ぁぃぅぇぉっゃゅょゎゕゖ ァィゥェォッャュョヮヵヶ ㇰ–ㇿ;单位% ℃。 | JIS X 4051的默认设置;日本地区的默认设置。 |
ja-strict | 同ja-very-strict,但小假名、ー和々可以出现在行首。 | 一般图书(JLReq所说的“严格”)。 |
ja-loose | 只有后括号和后引号、、,以及。.。连接号、?!、中点、叠字符、小假名和ー都可以出现在行首。 | 报纸(JLReq所说的“宽松”)。 |
在每个日文级别下,行尾都不会出现前括号或前引号,货币符号跟着它的数字(ja-loose除外),分隔号没有限制(那条规则来自GB/T 15834)。两字长的――和……可以出现在行首,这是JLReq所允许的,但从不拆开,〳〵也不拆开。数字与其符号和单位在一起(¥1,500、50%),拉丁单词保持完整,除非它比整行还宽;注码从不出现在行首,总跟前一个字符在一起。
当下一个字符不能出现在行首时,排版器先按下文JLReq的顺序放弃行内的空白,尝试把它挤进本行(追い込み,挤进),不行才把它前面的字符带到下一行(追い出し,挤出)。々位于行首时从不替换成它所重复的汉字(JLReq提到了这种做法,但它改动了文字)。
#约物:标点间距
日文的标点(约物,約物)按全角排:字形占半个字宽,另外半个字宽是空白,在前括号之前、后括号之后以及、。之后。・:;位于其字宽的中央,两侧各留四分之一个字宽;?!占满自己的字宽。日文排版调整的正是这些空白(JLReq §3.1):
- 相邻标点。 两个标点相遇时,去掉一份半个字宽的空白:」、 「「 、「 」「 。」占一个半字宽而不是两个字宽;」・的两个字形之间保留四分之一个字宽(JLReq §3.1.4)。
compressAdjacent可以关闭这项挤压。 - 行尾。 位于行尾的后括号类标点保留半个字宽。本行需要多挤进一个字时,首先放弃的就是这段空白,而且要么整个放弃,要么完全不放弃。
- 行内,。之后的空白从不缩减;中点两侧的四分之一个字宽先于括号和、的半个字宽被放弃。
- **?和!**在句子继续时,其后加一个字宽的空白(JLReq §3.1.6):本当? そう思う。在后括号或另一个?!之前、段末或行末都不加,作者已在那里输入U+3000时也不再加。这段空白从不伸缩。
cjk.spaceAfterQuestion可以关闭它(或在其他地区打开它)。 - 数字。 两个汉字数字之间的、和・密排,从不断开:二、三日、三・一四。
一行稍长时,按以下顺序让出空白(JLReq §3.8.3):先是词间空格,然后是行尾标点后的半个字宽(整个放弃或完全不放弃),然后是行尾中点的四分之一个字宽,然后是行内中点的四分之一个字宽,然后是括号和、,的半个字宽,最后是日文与拉丁文字之间的间距,最多缩到八分之一个字宽。一行稍短时,像中文行一样把差额分配到字与字之间,只是前括号之后、后括号之前不加空白,、。・:;?!和全角空格旁边也不加(JLReq §3.1.11)。
#段首的括号
缩进一个字的段落可以以括号开头,小说中的对话大多如此。JLReq §3.1.5介绍了三种排法,由cjk.paragraphStartBracket选择:
'indent'(①):保留缩进,括号在其后另占一个字宽。'half'(③,日本地区的默认值):括号放弃字形之前的空白,填满缩进的后半个字宽,文字与其他段落的文字对齐。缩进两个字时,文字从第2个字宽开始。'flush'(天付き):括号放在边缘,不缩进。
这项设置只作用于有首行缩进的段落;悬挂缩进或不缩进的段落保持原样。在中文地区,'auto'像过去一样把括号按一般行首处理。段落内部自动换行后位于行首的括号总是顶格排(trimLineStart,日本地区默认打开)。
#标点悬挂(ぶら下げ)
cjk.hangingPunctuation默认为'auto',在日本地区就是'allow':原本会落到下一行行首、挤进也容纳不下的、。,.,悬挂在行尾之外(ぶら下げ),横排和竖排都是如此。?!、括号和中点从不悬挂。在其他地区,'auto'就是'none',与过去相同。'force'让位于行尾的这类标点都悬挂,'none'关闭悬挂。
#两端对齐与段落末行
日文正文两端对齐,段落最后一行密排。字与字之间需要超过半个字宽的行,按不足行长排出,并报为cjkLooseLine(见断词与两端对齐)。bodyText.avoidRunts打开时(默认如此),段落不会以只有一个字的行结束(泣き別れ):上一行先尝试放弃标点空白把这个字挤进来,前提是不让任何一行变松;不行,才让出一个字给最后一行。
#竖排
layout.writingMode: 'vertical-rl'把书竖排,在右侧装订,第一页是左页(JLReq §2.3)。页面模型与中文相同:栏、右侧装订、图和各种输出见中文排版 › 竖排。对日文书有两点值得重复。各栏依次填满,章末不齐底(成り行き),横排书的各栏则要齐底。标题样式可以设置自己的书写方向,所以竖排书后面的索引或参考文献可以横排,很多书就是这样。
#竖排字形
在日本地区,每个字符都按JLReq §3.1和UAX #50的要求摆放:
- 小假名(ぁ っ ャ ㇰ)使用字体的竖排字形,比横排字形偏上偏右;字体没有竖排字形时,把字形移动约八分之一个字宽。
- **、。,.和大陆一样位于字格右上。:;旋转四分之一圈。!?直立居中。・**占一个字宽。
- **“ ”**是只用于横排的引号:竖排行把它们印成〝 〟。Canvas和PDF中,复制和搜索的文字仍保留“ ”;HTML复制出来的是〝〟。‘ ’则旋转。
- 括号、ー、〜和破折号沿列向下。
- 〳〵(くの字点,重复两个假名的符号)是只用于竖排的符号,占两个字格高,从不拆开。
沙盒加载了字体族的vert副本时,Canvas使用字体自带的竖排字形;PDF通过竖排模式字体绘制它们(见中文排版 › 各输出中的竖排文字)。
#纵中横
最多两位的数字直立排在一个字格中(cjk.uprightDigits,默认2),:tcy[…]、:upright[…]和:sideways[…]可以手动设置一段文字,与中文相同。在日本地区,!!、!?、?!和??这几对标点也直立排在一个字格中,半角和全角都可以(すごい!?):全角的一对用半角字形绘制,这样不必把笔画压窄一半就能放进一个字宽。紧挨拉丁单词(Wow!!)、第三个标点(!!!)或数字的一对保持原样。这样的字格从不出现在行首。
#页面、栏与页码
竖排日文书通常在页面下端用阿拉伯数字印页码;如果设计要在切口竖排页码,则用汉字:page.pageNumbering.format: 'cjk-decimal'把第105页写成一〇五,这是页码所用的逐位写法(JLReq §2.6)。章从右页(recto)开始,在右侧装订的书中就是左手边的页面:breakBefore: { enabled: true, parity: 'odd' }。竖排文本元素中的切口书眉不加改动即可用于日文书。
#振假名
振假名是排在汉字旁边的假名读音:横排时在字上方,竖排时在字右侧。它们就是注音,:ruby[…]和简写形式{…|…}像标注中文拼音一样标注它们,另外有三处日文特有的地方:读音怎样分配到基字上,最多能伸到相邻字上多少,以及较短的读音怎样拉开间距。
#单字注音、整词注音与熟语注音
{東京|とう|きょう}に行く。{紫陽花|あじさい}が咲いた。
:ruby[昨日]{rt="きのう" mode=group}、:ruby[明日]{rt="あ|す" mode=jukugo align=jis}。- 熟语注音(熟語ルビ):复合词的每个汉字各有自己的读音,行可以在汉字之间断开,每一部分保留自己的读音。某个读音比它的汉字长时,可以伸到词中下一个汉字上,但读音彼此从不重叠;全部放不下时,整个词共用一个读音,按整词注音排。在日文文档中,
{東京|とう|きょう}(每个|一个读音)就是熟语注音。 - 整词注音(グループルビ):整个词上方一个读音,从不断开。写作
{紫陽花|あじさい}(整个基字一个读音)、group或mode=group。青空文库的紫陽花《あじさい》是整词注音,转换器为它写出的也是。 - 单字注音(モノルビ):每个汉字一个读音,不伸到相邻字上,写作
mode=mono。在中文文档中,{東京|とう|きょう}就是这个意思。
#伸出与对齐
cjk.ruby.align决定比基字短的读音怎样排开。'jis'(日本地区的默认值)按1:2:1排:第一个假名之前和最后一个假名之后各半份,假名之间各一份(JIS X 4051,JLReq §3.3.6);'center'密排居中;'start'从基字的起点开始排。比基字长的读音在cjk.ruby.overhang允许的范围内伸到两侧的字上,其余的空间靠把基字拉开得到('jis'下按1:2:1):
'kana'(日本地区的默认值):伸到假名、ー或标点的空白一侧上最多一个注音字,伸到前括号上半个注音字,汉字、拉丁单词或另一个读音上不伸(JLReq §3.3.8)。'any':伸到任何没有读音的相邻字上半个注音字。'none':基字加宽到整个读音的宽度。
在行首和行尾,读音不超出边缘:它与边缘对齐,基字向内移动。cjk.ruby.smallKana: 'full'把读音中的小假名排成全尺寸(きょう排作きよう),有些书为了易读这样做;'keep'(默认)按原样印出。每个词的读音可以用align=和mode=单独设置,它们优先于配置。在中文地区,auto值与过去相同,拼音和注音符号照旧排。
振假名位于行间空隙中:正文行高约1.75 em时,能容下一半字号的读音(JLReq §2.4.2),空隙太窄时报为rubyExceedsLeading。注音读音也用作它所标注的词的索引读音(见五十音顺索引)。
#傍点与傍线
日文不把字母倾斜。它用字旁的记号来强调,并在字旁画线表示其他用途;记号不改变文字,所以搜索和复制的文本按原样读出这些字符。
#傍点
日文文字上的Markdown强调*とんと*,在横排时每个字上方、竖排时每个字右侧印一个芝麻点(﹅,即小说中的傍点)(JLReq §3.3.9);同一段强调中的拉丁字母仍保留斜体。:dots[…]明确地做同样的事,并用属性选择记号:
それは*とんと*見当がつかぬ。:dots[ここ]{style=circle fill=open}が大切だ。cjk.emphasisMark为全书设定默认值:style为'sesame'、'dot'或'circle',fill为'filled'或'open'(空心芝麻点就是青空文库文本中的白ゴマ),position为'over'(竖排时在右侧)或'under'(在左侧)。它的auto值取决于地区:日本是上方的芝麻点,中国是下方的圆点。芝麻点在两种书写方向中朝向纸面的同一方向。振假名和傍点在同一侧时,傍点排在读音外侧。
#傍线
:sideline[…]在文字旁画一条线(傍線),横排时在下方,竖排时在右侧,穿过标点和空格:
:sideline[ここに線を引く]、:sideline[二重線]{style=double}、:sideline[波線]{style=wavy pos=over}style为solid(默认)、double、wavy或dotted;pos为over或under(竖排时over在右侧,under在左侧)。两条傍线相接时,各让出八分之一个字宽。它适用于任何文字:加了下划线的英文短语也是一条傍线。与振假名在同一侧的傍线会和读音重叠;请把其中一个放到另一侧。
#书名与割注
:book[こころ]印作『こころ』,书名中的书名用「」。cjk.bookTitleBrackets可以设置别的括号,由外向内排列:[{ open: '《', close: '》' }]。:warichu[…]在行内把注释排成两行、字号减半的小字(割注),在日本地区默认用()括起;cjk.warichu.open: ''和close: ''则不加括号。**…**用正文字体族的粗体排;JLReq所说的用黑体强调,需要单独设置一个段落样式或字符样式。
#汉文训读
按日语读法读古汉语(漢文訓読)时,字旁有小记号:返点(返り点)告诉读者稍后回到某个字,送假名(送り仮名)是日语的词尾,竖点(竪点)把两个字连起来。:kunten[…]标注这些记号;文字不重新排序,因为读者是借助记号来读的。
:kunten[學]{okuri="ビテ"}而:kunten[時]{okuri="ニ"}:kunten[習]{kaeri="二" okuri="フ"}:kunten[之]{kaeri="一" okuri="ヲ"}。kaeri:按原样写出的返点:レ,一 二 三 四,上 中 下,甲 乙 丙 丁,天 地 人,以及组合的一レ 上レ 甲レ 天レ。汉文专用码位㆑ ㆒ …按它们所代表的字符读。okuri:送假名。青空文库的括号(ヲ)会被去掉。tate:一个开关;竖点把这个字和下一个字连起来。
记号属于方括号中的最后一个字。按照JIS X 4051 §5,返点以一半字号排在字后、行的下端一侧(竖排时在左下),自己占半个字宽;送假名从字的中部开始排在行的上端一侧(右侧),较长的送假名会把下一个字往后推。横排沿用同样的规则:返点在字后的下半部,送假名在行的上方。cjk.kunten设置fontSize(默认半个字宽)、color和placement:'inline'(默认,按JIS的排法)或'interlinear',后者的记号不占步进宽度,放在行间空隙中。复制的文字、HTML和PDF的/ActualText读作學ビテ而時ニ習フ之ヲ:送假名跟在各自的字后面,返点略去。行间空隙容不下送假名时报为kuntenExceedsLeading。
#数字与编号
所有编号设置(页码、有序列表、脚注、图表计数器、标题模板和PDF页面标签)都支持CSS Counter Styles中的日文样式:
| 样式 | 印出 | 记号 |
|---|---|---|
japanese-informal | 一、十、十二、百一、千十、一万一 | 日文文档中的一 |
japanese-formal | 壱、壱拾、壱百、弐阡参 | 壱 |
hiragana | あ、い、う … ん、ああ | あ |
katakana | ア、イ、ウ … ン、アア | ア |
hiragana-iroha | い、ろ、は … す、いい | い |
katakana-iroha | イ、ロ、ハ … ス、イイ | イ |
japanese-informal按日文写数的方式计数:十前面不加一,空位不写零(百一),按四位一组用万、億、兆。japanese-formal写法律文书中的大字,每个单位前都保留壱(写壱拾,不写拾)。假名序列遵循五十音(48个假名,包括ゐ和ゑ)和伊吕波歌(47个假名),排到最后一个之后接着用两个假名。逐位的汉字数字(二〇二六)是cjk-decimal,年份和页码用这种写法。在日文文档中,记号一表示japanese-informal;在中文文档中它仍表示中文数字,所以第{1:一}章在日文中印作第百一章,在中文中印作第一百零一章。
headings: {
levels: [{ level: 1, numberingTemplate: '第{1:一}章', numberSeparator: ' ' }],
},
orderedLists: {
levels: [
{ level: 1, numberFormat: 'japanese-informal', separator: '、' },
{ level: 2, numberFormat: 'japanese-informal', prefix: '(', separator: ')' },
{ level: 3, numberFormat: 'arabic', separator: '' },
{ level: 4, numberFormat: 'arabic', prefix: '(', separator: ')' },
{ level: 5, numberFormat: 'circled-decimal', separator: '' },
],
},这是竖排书的列表编号(一、 (一) 1 (1) ①)。横排的技术书按政府公文写作指南的顺序编号,即1. (1) ア (ア) ①,第3和第4级用katakana。{1:words}把数字写成日文(二十一),{1:ordinal}加上第(第二十一);设计文本中的{numberHan}是japanese-informal。编号为:::part{number="第三巻"}的篇,在需要数字的占位符中按3处理。
#标题与文字块
日文标题按正文行数来摆放、按正文字数来缩进;另有几种文字块从行尾一侧排起,或在页面上居中。这些设置都需要主动打开:书不设置它们,就什么都不变。
#标题占行(行取り)
标题级别或标题样式上的lineSpan让标题占用这么多正文行(行取り,JLReq §4.1.6):lineSpan: 3就是3行取り的标题,标题文字在三行组成的带中居中,取代marginTop和marginBottom。这条带从一条正文行开始,其后的文字仍留在网格上,两种书写方向都是如此,使用cjk.grid时也一样。比带长的标题取下一个整数行。章首页标题(span: 'page')、带advancedDesign的标题、隐藏的标题以及标注框内的标题保留各自的外边距。
#缩进与均排
级别或样式上的indent让标题从行首缩进,单位是正文的字宽(字下げ):indent: { value: 6, unit: 'em' }就是6字下げ,与标题本身的字号无关。jidori把单行标题均匀拉开到标题自身字宽的这么多倍(字取り):设为jidori: 3时,序章排作序 章,占满三个字。在标题文字后写{jidori=5}只设置这一个标题,{jidori=0}关闭其级别的均排。
headings: {
levels: [
{ level: 2, lineSpan: 3, indent: { value: 6, unit: 'em' } },
{ level: 3, lineSpan: 2, indent: { value: 8, unit: 'em' }, jidori: 4 },
],
},#地付き的文字块与居中页面
书信的日期和署名与行尾对齐(地付き),或从行尾往上空几个字(地からN字上げ)。:::paragraphs可以把align、indent和endIndent作为属性,不需要样式,纯数字按字宽计:
:::paragraphs{align=end endIndent=1}
大正三年四月
夏目漱石
:::endIndent也是段落样式的一个字段。:::pagebreak{center}让它开启的页面上的文字在版心的上下之间居中(竖排时在左右之间居中):即篇名页或献词页的ページの左右中央。请再用一个:::pagebreak结束这一页。
#偶数页末的标题
headings.keepWithNext防止标题位于一栏的末尾。JLReq §4.1.7允许标题位于偶数页最后一栏的末尾,因为它的正文从同一跨页的对面一页开始;headings.keepWithNextSpread: true允许这样排,左侧装订和右侧装订的书都适用。
#注释
日文书安排注释的方式比西文书多(JLReq §4.2),Postext为此增加了两种注码和一种位置。注码写在句末的。之前:先生[^1]。。注码跟随前一个字符,。又从不出现在行首,所以这三者永远不会分开。
#注码
footnotes.markerPosition除了'superscript'和'inline',还有两个日文用的值:
'right':小号注码与竖排行的右侧对齐,竖排书的(1)就是这样排的;横排时是上标。markerSize默认为0.7 em。'side'(合印):约0.6 em的注码排在被注词的旁边、注音一侧,结束于该词最后一个字结束的地方。它不占行内空间,行的断行和两端对齐都当它不存在。
footnotes.numberGap: 'em'在注文开头的编号之后放一个注文字号的整字宽(紧挨CJK文字时是全角空格),取代半个字宽的空格。
#日文书的默认值
作者不设置时,日文文档取以下值(配置参考列出了每个字段):
| 字段 | 竖排书 | 横排书 |
|---|---|---|
placement | chapterEnd(後注) | column |
numbering | chapter | page |
markerPosition | right | 上标 |
markerTemplate | ({n}),数字直立 | {n} |
separator.width | 行长的三分之一 | 行长的三分之一 |
| 章末注 | 编号后一个字宽,悬挂缩进两个字 | placement为chapterEnd时相同 |
明确设置的值优先,并在保存书时保留。中文、阿拉伯文和拉丁文文档保持各自的默认值。
#跨页旁注(傍注)
placement: 'spread'把竖排书的注释排在正文旁边(傍注),很多学术书和译著都这样排:一个跨页两页上引用的注释排到左页的末尾,上面有一条长为行长三分之一的线,按跨页编号(numbering: 'spread',使用这个位置时的默认值)。左页放不下全部注释、又要留下至少一行正文时,最后几条注释留在右页的下端;注释哪里都放不下的行,连同注释一起移到下一个跨页。横排书没有这种位置:在那里'spread'退回为'column',并给出unknownConfigValue警告。
#五十音顺索引
日文索引按读音排序,而不是按字符:漱石排在そ下。:index标记用yomi(或reading)给出假名读音:
:index[夏目漱石]{yomi="なつめそうせき"}は:index[{東京|とう|きょう}]に生まれた。标记没有yomi时,依次用其振假名的读音(第二个标记按とうきょう排序)、sort键、文字本身来代替。排序键中仍有汉字的条目报为indexReadingMissing,排在假名之后,不归入任何组。在:index[…]里请用简写形式写振假名,因为:ruby[…]需要把它的方括号转义。
排序遵循JIS X 4061:片假名按平假名排,小假名按大假名排,ー按它前面的元音排(コーヒー排在こうちゃ和こおり之间),叠字符按它所重复的假名排;相同时清音在浊音前,浊音在半浊音前(は ば ぱ)。符号在最前,然后是按数值排序的数字,然后是拉丁单词,最后是假名。index.groupBy: 'gojuon'(日文索引的auto值)按五十音行分组,组名为あ行、か行、さ行 … わ行;'kana'按首个假名分组,像词典那样。拉丁条目在假名之前,按字母分组。索引的标签是日文(见随语言区域变化的设置)。
#引用
日文文档用CSL语言区域ja-JP引用:叙述式引用用と连接两位作者,三位及以上作者缩写为ほか(山田と佐藤、鈴木ほか),给标题加引号的样式使用「」和『』。随包附带样式sist02(SIST 02,日本科学技术期刊的指南):
citations: { style: 'sist02' },在BibTeX以及YAML或JSON数据中,用CJK字符书写、中间有空格的人名按姓在前读取:author = {夏目 漱石}的姓是夏目,名是漱石。罗马字拼写的人名保持通常的顺序。参考文献的标题是参考文献。见引用与参考文献。
#表格、题注与资源注释
振假名、傍点、傍线、书名和割注在表格单元格、题注和资源注释中的画法与正文相同,字号取单元格或题注的字号,Canvas、PDF和HTML都是如此,行间空隙也按同样方式检查。表格和题注的文字在每一页上都横排:在竖排页面上整个块直立,所以纵中横在那里不起作用,也没有竖排的表格文字(縦組みの表)。
#HTML与EPUB
HTML输出把每个读音写成语义化的注音:<ruby>東<rt>とう</rt>京<rt>きょう</rt></ruby>,每个词一个<ruby>,屏幕阅读器会读出来。日文文档的每一页都带lang="ja",所以逐页挂载页面的宿主程序也能得到日文字形。固定版式的EPUB由这些页面组成。
流式EPUB带有阅读系统能够自行应用的规则:三个禁则级别对应line-break: strict、normal或loose,书悬挂标点时用hanging-punctuation: allow-end,文字上方的芝麻点用text-emphasis,竖排书中的短数字和!?组合排在直立字格中,?!之后的一个字宽,傍线、训点、注码、标题的占行与缩进,竖排书还在包文件中声明primary-writing-mode。导航用日文命名。导出的其余部分见EPUB电子书。
#字体
Postext为每种样式只用一个字体族,缺字时不会退回到另一个字体族,所以日文书需要一款覆盖书中所印每个字符的日文字体。
- Noto Serif JP(明朝体,明朝)用于正文,Noto Sans JP(黑体,ゴシック)用于标题和标签,这是常用的搭配;它们覆盖JIS X 0213,包括罗马字的长音符号,并带有竖排字形。Shippori Mincho和Shippori Mincho B1有文库本页面的样貌,但没有ō和ū。BIZ UDPMincho的假名是比例宽度;它的等宽版本BIZ UDMincho适合字符网格。Zen Old Mincho、Klee One(教科书字体)和Kaisei Decol适合标题和展示用途。
- 字体的语言。 中文字体(Noto Serif SC或TC)用中文字形画汉字:不要用它排日文。泛CJK字体(Source Han Serif、Noto Serif CJK)两种字形都有,PDF用OpenType语言系统
JAN为日文文档以及任何文档中的{lang=ja}隔离段整形,所以其中的汉字和引号取日文字形。 - 用TrueType,不用CFF。 Google Fonts和Fontsource的TrueType版本会按用到的字形取子集。Source Han和Noto CJK的CFF
.otf文件会被整个嵌入,每个字重8到25 MB(cffEmbeddedWhole)。为竖排书取子集时,保留vert、vrt2、vhea和vmtx。 - 在浏览器中,Fontsource把一个日文字体族拆成约一百个编号文件,每个文件包含一部分字符;沙盒及其PDF标签页只加载文字用到的文件。Fontsource的文件都不包含变体假名(𛀁)或其他历史假名。
- 没有斜体。 日文字体没有斜体;强调用傍点。
配置参考中的中日韩字体给出了字体提供器的代码。
#青空文库源文本
青空文库(青空文庫)收有数千种已进入公有领域的日文文本,以纯文本录入,并有自己的标注法:读音写在《》中,读音的基字不从文字种类的变化处开始时用|标出起点,版式、强调、标题和JIS X 0208以外的字符用[#…]注记。postext-port技能附带一个转换器aozora.py(Python 3.10,只用标准库),把这样的文件转换成Postext Markdown:
python3 aozora.py 773_ruby_5968.zip -o kokoro.md --report report.json --styles styles.json它读取zip或文本文件,编码可以是UTF-8,也可以是青空文库文件所用的CP932,并写出:
漢字《かんじ》和|麦藁帽《むぎわらぼう》转为整词注音{漢字|かんじ},左侧读音转为pos=under;- 傍点转为
:dots[…]{style=sesame}(以及Postext能画的其他形状),傍线转为:sideline[…],縦中横转为:tcy[…],割り注转为:warichu[…],训点转为:kunten[…]; - 大・中・小見出し转为
#、##、###;改ページ、改丁和改見開き转为带相应奇偶的:::pagebreak; - 字下げ、地付き和字上げ转为
:::paragraphs{style="aozora-…"},并返回这些段落样式(--styles),供项目的paragraphStyles使用; - 外字(
※[#「てへん+劣」、第3水準1-84-77])通过JIS X 0213转为对应字符;/\转为〳〵;半角片假名转为全角。
段首的U+3000会被去掉(由配置缩进),以括号开头的段落交给cjk.paragraphStartBracket处理,所以第③种排法恰好落在源文本所放的位置。编辑注记([#「X」は底本では「Y」])和末尾的书目信息不印出:它们出现在报告和版权信息中,青空文库要求把后者与正文放在一起。转换器不认识的内容都连同行号列在报告中。见postext-port技能。
#两套完整配置
两者都是预设JSON,即沙盒保存的格式(postext-config.json)。
#竖排的文库本小说
一本文库本(文庫,105 × 148 mm),Noto Serif JP 9 pt,每行38字,竖排,右侧装订。章从右页开始,按第一章编号,缩进四个字;节标题占三行,缩进六个字。禁则、约物间距、第③种段首括号、悬挂、芝麻点、『』、振假名间距和章末注都来自语言区域设置:
{
"locale": "ja",
"page": {
"sizePreset": "custom",
"width": { "value": 105, "unit": "mm" },
"height": { "value": 148, "unit": "mm" },
"margins": {
"top": { "value": 14, "unit": "mm" },
"bottom": { "value": 13, "unit": "mm" },
"left": { "value": 10, "unit": "mm" },
"right": { "value": 9, "unit": "mm" },
"mirror": true
}
},
"layout": { "layoutType": "single", "writingMode": "vertical-rl" },
"bodyText": {
"fontFamily": "Noto Serif JP",
"fontSize": { "value": 9, "unit": "pt" },
"lineHeight": { "value": 1.75, "unit": "em" },
"textAlign": "justify",
"firstLineIndent": { "value": 1, "unit": "em" }
},
"headings": {
"fontFamily": "Noto Sans JP",
"levels": [
{
"level": 1,
"fontSize": { "value": 12, "unit": "pt" },
"numberingTemplate": "第{1:一}章",
"numberSeparator": " ",
"indent": { "value": 4, "unit": "em" },
"breakBefore": { "enabled": true, "parity": "odd" }
},
{
"level": 2,
"fontSize": { "value": 10, "unit": "pt" },
"lineSpan": 3,
"indent": { "value": 6, "unit": "em" }
}
]
},
"cjk": { "grid": { "enabled": true, "charsPerLine": 38 } },
"header": { "elements": [] },
"footer": {
"elements": [
{
"kind": "text",
"id": "folio",
"content": "{pageNumber}",
"fontFamily": "Noto Serif JP",
"fontSize": { "value": 7, "unit": "pt" },
"overflow": "clip",
"placement": { "anchor": { "to": "container", "edge": "center" } }
}
]
}
}没有设置linesPerPage,所以页面按宽度能容纳多少行就排多少行(这里是15行)。parity: 'odd'让每章从左页开始,即右侧装订的书的右页(recto)。注释不需要任何设置:它们排在每章之后,注码(1)在行的右侧。
#横排的技术书
一本B5开本的书(182 × 257 mm),横排,正文Noto Serif JP 9.5 pt,标题Noto Sans JP,章按第1章编号,节标题占三行,小节标题占两行,列表编号为1. (1) ア (ア) ①,注释排在页面下端并按页编号,索引按五十音行分组:
{
"locale": "ja",
"page": {
"sizePreset": "custom",
"width": { "value": 182, "unit": "mm" },
"height": { "value": 257, "unit": "mm" },
"margins": {
"top": { "value": 22, "unit": "mm" },
"bottom": { "value": 22, "unit": "mm" },
"left": { "value": 20, "unit": "mm" },
"right": { "value": 18, "unit": "mm" },
"mirror": true
}
},
"layout": { "layoutType": "single" },
"bodyText": {
"fontFamily": "Noto Serif JP",
"fontSize": { "value": 9.5, "unit": "pt" },
"lineHeight": { "value": 1.75, "unit": "em" },
"textAlign": "justify",
"firstLineIndent": { "value": 1, "unit": "em" }
},
"headings": {
"fontFamily": "Noto Sans JP",
"levels": [
{
"level": 1,
"fontSize": { "value": 16, "unit": "pt" },
"numberingTemplate": "第{1}章",
"numberSeparator": " ",
"breakBefore": { "enabled": true, "parity": "odd" }
},
{ "level": 2, "fontSize": { "value": 12, "unit": "pt" }, "numberingTemplate": "{1}.{2}", "lineSpan": 3 },
{ "level": 3, "fontSize": { "value": 10, "unit": "pt" }, "lineSpan": 2 }
]
},
"orderedLists": {
"levels": [
{ "level": 1, "numberFormat": "arabic", "separator": "." },
{ "level": 2, "numberFormat": "arabic", "prefix": "(", "separator": ")" },
{ "level": 3, "numberFormat": "katakana", "separator": "" },
{ "level": 4, "numberFormat": "katakana", "prefix": "(", "separator": ")" },
{ "level": 5, "numberFormat": "circled-decimal", "separator": "" }
]
},
"captionStyle": { "labelNumberGap": "", "labelSeparator": " " },
"header": { "elements": [] },
"footer": {
"elements": [
{
"kind": "text",
"id": "folio",
"content": "{pageNumber}",
"fontFamily": "Noto Sans JP",
"fontSize": { "value": 8, "unit": "pt" },
"overflow": "clip",
"placement": { "anchor": { "to": "container", "edge": "center" } }
}
]
}
}不需要cjk和footnotes键:语言区域给横排日文带来它的禁则和间距,注释排在页面下端、按页编号,上面有一条长为行长三分之一的线。题注读作図1-1 構成。
#在沙盒和排版食谱中
在沙盒中,设计 › 书写系统包含文档语言(日本語)、书写方向、装订方式和所有cjk设置,日文的设置也在其中。**日语默认设置 › 查看…**可以一步把书设为日文排版,可选竖排文库本或横排技术书,并先列出每一项改动:Noto Serif JP和Noto Sans JP,1.75 em的行距,一个字的缩进,竖排书的字符网格,図和表,第一章,占行并缩进的标题,日文列表编号,以及把会妨碍日文设置的中文设置恢复为自动。字体选择器把日文字体族列为一组,字体样张显示一段带傍点的吾輩は猫である,日文书的编辑器工具栏有注音按钮和纵中横按钮。见沙盒。
展示书架上有夏目漱石的《心》(こころ,1914年)日文版,根据青空文库的文本竖排、右侧装订;沙盒自带的指南也有日文版。排版食谱在“日文排版”合集中收录了日文食谱,每个食谱是一页或一组跨页,附有排出它的脚本。
#已知限制
- 禁则:位于行首的々不会替换成它所重复的汉字;JLReq中介于两者之间、用于杂志的“宽松”惯例没有单独的级别;在割注中,‥‥可能被分到两行。
- 约物:汉字数字之间密排的、也作用于写成一、二、三的列举;位于行尾的中点只放弃其后的四分之一个字宽。
- 振假名:熟语注音的排法是让每个读音尽量靠近自己的汉字,并未覆盖JLReq附录F列出的每一种情况;段首的读音不会伸到缩进上;在同一行中两侧都被截断的词,排出来可能略长。
- 记号:青空文库的三角、双圆、蛇目和叉号(三角、二重丸、蛇の目、ばつ傍点),
pos=under以外的左侧记号,以及虚线或点划线的傍线都不绘制(转换器会报告它们);与振假名同侧的傍线会和读音重叠;**…**不会换成黑体。 - 汉文训读:组合返点(一レ)是两个半尺寸字形,而不是一个合成的记号;在行间模式下,较长的送假名可能碰到下一个字的记号;割注、题注和单元格中的记号会被丢弃。
- 标题与文字块:行取り不作用于标注框内的标题或章首页标题;
:::pagebreak{center}本身不会结束这一页;正文中的单个词没有行内的字取り。 - 注释:在分为几栏的页面上,跨页旁注排到正文所在栏的下端;横排书没有跨页旁注;推迟注释所需的空间在左页的图确定之前估算。
- 索引:分隔符保持为
,;拉丁条目排在假名之前,不能改为排在最后;不可见的标记不会从同一行别处的注音借读音。 - 引用:SIST 02是唯一随包附带的日文样式;著者-出版年式引用保留ASCII标点;参考文献不按读音排序。
- 表格:单元格和题注的文字在每一页上都横排。
- 字体:每种样式一个字体族,不回退;CFF字体整个嵌入;不使用比例竖排度量(
vpal)。 - 设计文字(书眉、章首页、标注框标题)在任意两个字符之间都可断行,不遵循禁则,也不调整约物间距,读音和记号印成普通文字。
#参考资料
- W3C,Requirements for Japanese Text Layout(JLReq),Group Note。
- JIS X 4051:2004《日本語文書の組版方法》(日文文档的排版方法)。
- JIS X 4061:1996《日本語文字列照合順番》(日文字符串的排序规则)。
- W3C,CSS Text Level 3和Level 4、CSS Text Decoration Level 3(
text-emphasis)、CSS Ruby Annotation Layout、CSS Writing Modes Level 4和CSS Counter Styles Level 3。 - Unicode标准附件第14号Line Breaking Algorithm和第50号Unicode Vertical Text Layout。
- 青空文库,注記一覧(青空文库注记指南)。
- SIST 02《参照文献の書き方》(日本科学技术振兴机构),以及CSL的ja-JP语言区域。