|
typeset 0.1.0
縦書き・横書きの日本語組版ライブラリ(JLReq 水準、ラスタ / PDF / SVG)
|
text/char_class — JLReq の文字クラス [詳解]
クラス | |
| struct | GlueSpec |
| 伸縮するアキ(em 単位) [詳解] | |
| class | HyphenationDictionary |
言語ごとのパターン。TextStyle::language(BCP47)で引く。 完全一致 → 主言語("en-GB" なら "en")→ 既定の言語(setDefaultLanguage)の順に探す。 [詳解] | |
| class | Hyphenator |
列挙型 | |
| enum class | CharClass : uint8_t { OpenBracket , CloseBracket , Hyphen , Dividing , MiddleDot , FullStop , Comma , Inseparable , Iteration , Prolonged , SmallKana , PrefixAbbr , PostfixAbbr , Ideographic , Hiragana , Katakana , IdeographicSpace , Space , Western , Digit , Unknown } |
| 文字クラス(コメントの cl-NN は JLReq の文字クラス番号) [詳解] | |
| enum class | BodyAlign : uint8_t { Full , Start , End , Center } |
| 仮想ボディ内での字面の寄り [詳解] | |
| enum class | BreakOpportunity : uint8_t { Must , Allowed , Prohibited } |
| enum class | CharOrientation : uint8_t { Upright , Rotated } |
| 縦組み中の 1 文字の向き [詳解] | |
関数 | |
| CharClass | getCharClass (char32_t cp) |
| bool | isHalfWidthPunctuation (CharClass c) |
| 半角に詰められる約物か(仮想ボディが全角、字面が半角のもの) | |
| BodyAlign | getBodyAlign (CharClass c) |
| bool | isLineStartProhibited (CharClass c) |
| 行頭禁則 — この文字の直前では改行できない | |
| bool | isLineEndProhibited (CharClass c) |
| 行末禁則 — この文字の直後では改行できない | |
| bool | isJapanese (CharClass c) |
| 和文の文字か(和欧間アキの判定に使う) | |
| bool | isWestern (CharClass c) |
| 欧文の文字か(和欧間アキの判定に使う) | |
| bool | isHangable (CharClass c) |
| ぶら下げ可能な約物か(句点類・読点類) | |
| std::vector< BreakOpportunity > | lineBreakOpportunities (const std::u16string &text, const char *lang="ja") |
| 位置 i の文字の**直後**で切れるかを返す(text.size() 個) | |
| CharOrientation | getCharOrientation (char32_t cp) |
| U / Tu / Tr を Upright、R を Rotated として返す。Tu・Tr(縦字形へ置換して 正立させる類。括弧・句読点・波ダッシュ等)を Upright に寄せているのは、 TTB でシェイピングして vert/vrt2 を効かせるため。 | |
| GlueSpec | getSpacing (CharClass before, CharClass after) |
| 隣接する 2 文字の間に入るアキ量 | |
| float | getBodyWidth (CharClass c) |
| 仮想ボディ幅(em 単位) | |
| char32_t | codePointAt (const std::u16string &s, size_t i, size_t &length) |
| UTF-16 の位置 i からコードポイントを取り出す(サロゲートペア対応) | |
| char32_t | codePointAt (const std::u16string &s, size_t i) |
| void | appendCodePoint (std::u16string &out, char32_t cp) |
| コードポイントを UTF-16 に追加する | |
| std::u16string | utf8ToUtf16 (const std::string &utf8) |
| std::string | utf16ToUtf8 (const std::u16string &utf16) |
変数 | |
| constexpr char32_t | kSoftHyphen = 0x00AD |
| ソフトハイフン | |
text/char_class — JLReq の文字クラス
text/utf — UTF-16 ⇄ コードポイントの小さなヘルパ
text/spacing_table — 文字クラス間のアキ量表
text/orientation — UAX #50 Vertical_Orientation 相当の判定
text/line_break — UAX #14 の行分割機会(libunibreak の包み)
text/hyphenation — 欧文のハイフネーション(Liang のパターン)
「日本語組版処理の要件」附属書 A の文字クラスのうち、間隔処理(表 3)と 禁則処理に必要なものを持つ。分類は 1 文字(コードポイント)単位。 クラスタ(結合文字列)の文字クラスは先頭のコードポイントで決める。 書字方向には依存しない(縦横共通)。richtext CharClass の移植。
TeX と同じパターン(hyph-en-us.tex などの \patterns{} / \hyphenation{})を読んで、 単語の中の分割位置を返す。辞書は言語ごとに用意する必要があるので、パターンは利用側が読み込む (hyph-utf8 や LibreOffice の辞書がそのまま使える。ライセンスがそれぞれ違うので同梱しない)。
パターンを持たない言語でも、テキスト中の**ソフトハイフン U+00AD** は常に分割位置として扱う。
和文の禁則は CharClass から直接求まるので、これは 欧文の単語内を割らない ためだけに使う(ハイフン・スラッシュの後ろで切れる、といった細部を UAX #14 に任せる)。
JLReq 表 3(連続する文字クラス間の空き量)を、隣接ペアから引ける形で持つ。 単位は em(フォントサイズ基準)。
アキは「自然値・伸び・縮み」の 3 値(TeX の glue)で持つ。この形にした 時点で、追い込み・追い出し・両端揃えは「グルーの伸縮でどう行長に合わせるか」 という 1 つの問題に統一される。
約物そのものの仮想ボディは全角のままで、ここで扱うのは**文字と文字の間**の アキ。字面が半角に寄っている約物は、ボディ幅を半角にしてから前後にアキを 入れる形で組む(getBodyAlign を参照)。
組版層の文字位置はすべて UTF-16 単位(HarfBuzz のクラスタと揃える)。
|
strong |
文字クラス(コメントの cl-NN は JLReq の文字クラス番号)
char_class.hpp の 19 行目に定義があります。
|
strong |
仮想ボディ内での字面の寄り
約物は全角の仮想ボディの中で字面が半分に寄っている。詰めるとは 「ボディを半角にする」ことなので、字面がボディのどちら側にあるかで グリフの描画オフセットが決まる。
| 列挙値 | |
|---|---|
| Full | 全角ボディいっぱい(通常の和字・欧文) |
| Start | 行の進む向きの手前側に寄る(句読点・終わり括弧) |
| End | 奥側に寄る(始め括弧) |
| Center | 中央に寄る(中点類) |
char_class.hpp の 50 行目に定義があります。
|
strong |
| 列挙値 | |
|---|---|
| Must | 強制改行(LF 等) |
| Allowed | 切ってよい |
| Prohibited | 切れない |
line_break.hpp の 16 行目に定義があります。
|
strong |
縦組み中の 1 文字の向き
| 列挙値 | |
|---|---|
| Upright | 正立(縦字形置換は HarfBuzz の vert/vrt2 が行う) |
| Rotated | 横倒し(時計回りに 90 度) |
orientation.hpp の 12 行目に定義があります。
| CharClass typeset::text::getCharClass | ( | char32_t | cp | ) |
| bool typeset::text::isHalfWidthPunctuation | ( | CharClass | c | ) |
半角に詰められる約物か(仮想ボディが全角、字面が半角のもの)
| bool typeset::text::isLineStartProhibited | ( | CharClass | c | ) |
行頭禁則 — この文字の直前では改行できない
| bool typeset::text::isLineEndProhibited | ( | CharClass | c | ) |
行末禁則 — この文字の直後では改行できない
| bool typeset::text::isJapanese | ( | CharClass | c | ) |
和文の文字か(和欧間アキの判定に使う)
| bool typeset::text::isWestern | ( | CharClass | c | ) |
欧文の文字か(和欧間アキの判定に使う)
| bool typeset::text::isHangable | ( | CharClass | c | ) |
ぶら下げ可能な約物か(句点類・読点類)
| std::vector< BreakOpportunity > typeset::text::lineBreakOpportunities | ( | const std::u16string & | text, |
| const char * | lang = "ja" |
||
| ) |
位置 i の文字の**直後**で切れるかを返す(text.size() 個)
| lang | BCP47("ja" / "en" など)。空なら既定 |
| CharOrientation typeset::text::getCharOrientation | ( | char32_t | cp | ) |
U / Tu / Tr を Upright、R を Rotated として返す。Tu・Tr(縦字形へ置換して 正立させる類。括弧・句読点・波ダッシュ等)を Upright に寄せているのは、 TTB でシェイピングして vert/vrt2 を効かせるため。
| float typeset::text::getBodyWidth | ( | CharClass | c | ) |
仮想ボディ幅(em 単位)
字面が半角に寄る約物は 0.5em、それ以外の和字は 1.0em。欧文はここでは 決まらない(シェイパーが返すアドバンスをそのまま使う)ので 0 を返す。
|
inline |
|
inline |
参照先 codePointAt().
|
inline |
| std::u16string typeset::text::utf8ToUtf16 | ( | const std::string & | utf8 | ) |
| std::string typeset::text::utf16ToUtf8 | ( | const std::u16string & | utf16 | ) |
|
constexpr |
ソフトハイフン
hyphenation.hpp の 81 行目に定義があります。