typeset 0.1.0
縦書き・横書きの日本語組版ライブラリ(JLReq 水準、ラスタ / PDF / SVG)
読み取り中…
検索中…
一致する文字列を見つけられません
typeset::text 名前空間

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< BreakOpportunitylineBreakOpportunities (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 のクラスタと揃える)。

列挙型詳解

◆ CharClass

enum class typeset::text::CharClass : uint8_t
strong

文字クラス(コメントの cl-NN は JLReq の文字クラス番号)

列挙値
OpenBracket 

cl-01 始め括弧類 「(〔[{〈《【

CloseBracket 

cl-02 終わり括弧類 」)〕]}〉》】

Hyphen 

cl-03 ハイフン類 ‐ 〜 ゠ –

Dividing 

cl-04 区切り約物 ! ? ‼ ⁇

MiddleDot 

cl-05 中点類 ・ : ;

FullStop 

cl-06 句点類 。 .

Comma 

cl-07 読点類 、 ,

Inseparable 

cl-08 分離禁止文字 — … ‥ 〳〴〵

Iteration 

cl-09 繰返し記号 々 〻 ゝゞヽヾ

Prolonged 

cl-10 長音記号 ー

SmallKana 

cl-11 小書きの仮名 ぁぃぅ… ァィゥ… っゃゅょ

PrefixAbbr 

cl-12 前置省略記号 ¥ $ £ # €

PostfixAbbr 

cl-13 後置省略記号 ° ′ ″ ℃ % ‰

Ideographic 

cl-19 漢字等

Hiragana 

cl-20 平仮名

Katakana 

cl-21 片仮名

IdeographicSpace 

cl-24 和字間隔(全角空白)

Space 

cl-26 欧文間隔

Western 

cl-27 欧文用文字

Digit 

cl-27 のうち算用数字(縦中横の判定に使う)

Unknown 

上記に該当しないもの(和字扱い)

char_class.hpp19 行目に定義があります。

◆ BodyAlign

enum class typeset::text::BodyAlign : uint8_t
strong

仮想ボディ内での字面の寄り

約物は全角の仮想ボディの中で字面が半分に寄っている。詰めるとは 「ボディを半角にする」ことなので、字面がボディのどちら側にあるかで グリフの描画オフセットが決まる。

列挙値
Full 

全角ボディいっぱい(通常の和字・欧文)

Start 

行の進む向きの手前側に寄る(句読点・終わり括弧)

End 

奥側に寄る(始め括弧)

Center 

中央に寄る(中点類)

char_class.hpp50 行目に定義があります。

◆ BreakOpportunity

enum class typeset::text::BreakOpportunity : uint8_t
strong
列挙値
Must 

強制改行(LF 等)

Allowed 

切ってよい

Prohibited 

切れない

line_break.hpp16 行目に定義があります。

◆ CharOrientation

enum class typeset::text::CharOrientation : uint8_t
strong

縦組み中の 1 文字の向き

列挙値
Upright 

正立(縦字形置換は HarfBuzz の vert/vrt2 が行う)

Rotated 

横倒し(時計回りに 90 度)

orientation.hpp12 行目に定義があります。

関数詳解

◆ getCharClass()

CharClass typeset::text::getCharClass ( char32_t  cp)

◆ isHalfWidthPunctuation()

bool typeset::text::isHalfWidthPunctuation ( CharClass  c)

半角に詰められる約物か(仮想ボディが全角、字面が半角のもの)

◆ getBodyAlign()

BodyAlign typeset::text::getBodyAlign ( CharClass  c)

◆ isLineStartProhibited()

bool typeset::text::isLineStartProhibited ( CharClass  c)

行頭禁則 — この文字の直前では改行できない

◆ isLineEndProhibited()

bool typeset::text::isLineEndProhibited ( CharClass  c)

行末禁則 — この文字の直後では改行できない

◆ isJapanese()

bool typeset::text::isJapanese ( CharClass  c)

和文の文字か(和欧間アキの判定に使う)

◆ isWestern()

bool typeset::text::isWestern ( CharClass  c)

欧文の文字か(和欧間アキの判定に使う)

◆ isHangable()

bool typeset::text::isHangable ( CharClass  c)

ぶら下げ可能な約物か(句点類・読点類)

◆ lineBreakOpportunities()

std::vector< BreakOpportunity > typeset::text::lineBreakOpportunities ( const std::u16string &  text,
const char *  lang = "ja" 
)

位置 i の文字の**直後**で切れるかを返す(text.size() 個)

引数
langBCP47("ja" / "en" など)。空なら既定

◆ getCharOrientation()

CharOrientation typeset::text::getCharOrientation ( char32_t  cp)

U / Tu / Tr を Upright、R を Rotated として返す。Tu・Tr(縦字形へ置換して 正立させる類。括弧・句読点・波ダッシュ等)を Upright に寄せているのは、 TTB でシェイピングして vert/vrt2 を効かせるため。

◆ getSpacing()

GlueSpec typeset::text::getSpacing ( CharClass  before,
CharClass  after 
)

隣接する 2 文字の間に入るアキ量

◆ getBodyWidth()

float typeset::text::getBodyWidth ( CharClass  c)

仮想ボディ幅(em 単位)

字面が半角に寄る約物は 0.5em、それ以外の和字は 1.0em。欧文はここでは 決まらない(シェイパーが返すアドバンスをそのまま使う)ので 0 を返す。

◆ codePointAt() [1/2]

char32_t typeset::text::codePointAt ( const std::u16string &  s,
size_t  i,
size_t &  length 
)
inline

UTF-16 の位置 i からコードポイントを取り出す(サロゲートペア対応)

utf.hpp15 行目に定義があります。

参照元 codePointAt().

◆ codePointAt() [2/2]

char32_t typeset::text::codePointAt ( const std::u16string &  s,
size_t  i 
)
inline

utf.hpp29 行目に定義があります。

参照先 codePointAt().

◆ appendCodePoint()

void typeset::text::appendCodePoint ( std::u16string &  out,
char32_t  cp 
)
inline

コードポイントを UTF-16 に追加する

utf.hpp35 行目に定義があります。

◆ utf8ToUtf16()

std::u16string typeset::text::utf8ToUtf16 ( const std::string &  utf8)

◆ utf16ToUtf8()

std::string typeset::text::utf16ToUtf8 ( const std::u16string &  utf16)

変数詳解

◆ kSoftHyphen

constexpr char32_t typeset::text::kSoftHyphen = 0x00AD
constexpr

ソフトハイフン

hyphenation.hpp81 行目に定義があります。