2021-01-18 9:00 JST 〜 メンテナンスによるサービス全停止予定

チケット #37419

縦書き時の矢印の向き

登録: 2017-08-03 17:41 最終更新: 2019-07-25 22:17

報告者:
担当者:
(未割り当て)
チケットの種類:
状況:
オープン
コンポーネント:
(未割り当て)
マイルストーン:
(未割り当て)
優先度:
5 - 中
重要度:
5 - 中
解決法:
なし
ファイル:
なし

詳細

doraTeX さんの twitter (https://twitter.com/doraTeX/status/892922512564142080) にある話題ですが,

  1. \mbox{\tate 上⇦⇧⇩⇨⬅⬆⬇➡下}
を実行すると,左矢印が物理的には右向き,上矢印が下向き,……となります.

LuaTeX-ja の縦組用和文フォントでは何もしないと vert, vrt2 が両方オンになります (\tfont\VT=IPAexMincho:+vert;jfm=ujisvのように明示的に vert や vrt2 feature を指定すれば,この「自動で両方オンとなる」機能は無効になります).ZR さんの投稿 (https://twitter.com/zr_tex8r/status/892960245558919168) にあるとおり,二重に適用されるのはよろしくないようです.


さて,今回の場合,LuaTeX-ja のデフォルトの明朝(IPAex明朝)には vrt2 はないようです. しかし,LuaTeX-ja では vert と vrt2 の少なくとも片方がオンになっている場合,font feature の適用前に「縦書き用字形のグリフが『容易』に見つかればそれに置換する」という処理をしているので,これが悪さをしているかもしれません(あとで調べます).

チケットの履歴 (8 件中 3 件表示)

2017-08-03 17:41 更新者: h7k
  • 新しいチケット "縦書き時の矢印の向き" が作成されました
2017-08-04 05:44 更新者: h7k
コメント

調査・試験用ブランチ vert_vrt2 を作りました.

LuaTeX-ja の縦組用和文フォントでは何もしないと vert, vrt2 が両方オンになります

commit e65feac では「縦組用和文フォントで vert, vrt2 の有効・無効を明示的に指定しない場合,vrt2 feature があればそれを,なければ vert を有効にする」という仕様にしてみました. test/test51a-vert_vrt2.{tex,pdf} が例です.

ただ,luaotfload に与えるフォント指定と実際に有効になる feature が違うという状況(以前は luaotfload に渡す前に '+vert;+vrt2 を付加していた)なので,何か問題が出ないか心配です.

2017-08-07 20:56 更新者: h7k
コメント

MogaMincho のように,「vert feature はあるが矢印の置換先は定義されていない」場合もありますね(参考:#34941).

しかし,単純に #34941 のときに追加した処理を矢印にも行うようにすると,今度は矢印に vert feature による置換先が定義されている場合に問題になります(二重に適用されてしまう).「vert (or vrt2) feature で置換されない場合のみ独自で置換」という処理にできないか考えてみます.

2017-08-09 11:20 更新者: h7k
  • チケットの種類バグ から サポートリクエスト に更新されました
コメント

commit 0f0921ce(vert_vrt2 ブランチ)で次のような処理にしてみました.vert or vrt2 が(明示的または暗黙のうちに)有効になっている場合に発動します.

    vert feature の適用範囲外にある文字について,
    * 「和文フォントへの置換」時に,U+2025 -> U+FE30 のように,Unicode の
      - Vertical Forms (U+FE10--U+FE1F)
      -  CJK Compatibility Forms の一部 (U+FE30--U+FE44)
      へマッピングできるものは置き換える
    * 「JAcharの位置補正」時に,UTF#50 で R or Tr と指定されており,
      かつ vert feature による置き換え先が定義されていないグリフは
      90度回転状態にする
    * 例えば,小塚明朝では U=205A と U+FE30 が同一のグリフを用いることになっている.
      この場合 UTR#50 では U+2052 は R,U+FE30 は U となっているが,
      「回転しない」方を優先.
チケット #34941 の U+2014 については1つめの * の処理で, また MogaMincho における矢印の向きについては2つめの * の処理でそれぞれ向きが変わります(ただ,矢印の横線がベースラインとちょっとずれています). リポジトリ内の test/test51a-vert_vrt2.pdf を参照して下さい.

(Unicode 10.0 では UAX #50 という名称に変わったのですね.まだ古いデータ (revision 17) を参照していました)

2017-08-16 16:25 更新者: h7k
コメント

commit 0f0921ce では不十分な場合があったので,562df6e9 で修正しました.

具体的には,luatexja-preset で HG フォントを措定した場合など,vert feature が現在の (script,language) では適用されない状況でも無理やり vert を適用させることにしました.

  • luatexja-fontspec では script=hani かつ language=dflt にしています.
  • 手元の HG丸ゴシックM-PRO では,script=kana かつ language=dflt, jan の場合にのみ vert feature が適用できます.
2017-08-18 11:33 更新者: h7k
コメント

vert feature が現在の (script,language) では適用されない状況でも

もう一つの例として,Windows 7 付属の SimHei (simhei.ttf) を挙げておきます.

  • このフォントは,(script,language)=(hani,CHN) のときしか vert feature が存在しない.そのため,普通に \font\A=simhei.ttf:vert と指定しても vert は有効にならない.
  • 現行の OpenType の language system tag には CHN はない(簡体字中国語では ZHS を使う).
  • luaotfload で認識される language system tag は luaotfload-features.lua に登録されるものに限り,その中に CHN はない.
    従って,たとえ \font\A=simhei.ttf:script=hani;language=CHN;vert と指定しても vert は有効にならない(language は dflt と扱われてしまう).
  • 562df6e9 の仕様では,\tfont\A=simhei.ttf:jfm=ujisv と指定すれば,(script,language)=(hani,CHN) のときに vert feature が存在するので,自動的にこの vert に相当するグリフ置換が行われる.
2017-09-23 09:22 更新者: h7k
  • チケット完了時刻2017-09-23 09:22 に更新されました
  • 状況オープン から 完了 に更新されました
コメント

20170904.0 を出したので,ひとまず完了とします.

2019-07-25 22:17 更新者: h7k
  • 状況完了 から オープン に更新されました
  • 詳細が更新されました
コメント

#37531 で縦組時の原点位置情報を使えるようになったため,いろいろ試してみたら再び気になったので,再オープンします.

LuaTeX-ja で縦組用の字形を得る処理は,次の 5 ステップです.

  1. 縦組用和文フォントで vert, vrt2 の有効・無効を明示的に指定しない場合,vrt2 があればそれを,なければ vert を有効にする.
  2. もし vert, vrt2 少なくとも一方が(明示的か 1. によってか関わらず)現在の script, language の組み合わせではどちらも有効にならなかった場合は,「どれかのscript, languageで定義されている vert による (単一グリフから単一グリフへの)置換」を全部適用する.
  3. また,U+300A -> U+FE3D のように Unicode の範囲内で容易に縦書形に置き換えられる場合はその置換も行う.
  4. OpenType 機能による各種置換を行う(luaotfload の担当)
  5. いかなる script, language でも vert により置換されない」グリフ のうち,UAX#50r もしくは Tr と指定されているものは90度自動回転させる.

以上により,

標準では例えば和文扱いの βÅ は横組時から 90 度回転された横倒しの状態で組まれる……(a)

ことになります.β については 4. によりますが,Å については Adobe-Japan1-6 に横倒しになったグリフが準備されており,vrt2 でそれが使われるためです.


一方,LuaTeX-ja では同じ文字,例えば β, Å を和文扱いにも欧文扱いにもすることができます. 「β-conversion」のように欧文の単語の一部として組む場合には欧文扱いとしますから,

わざわざ和文扱いとした場合は,横倒しにはせずに正立させる……(b)

方が自然のように感じます.また,参考までに upTeX + dvipdfmx で β, Å を和文扱いで組んだ場合も正立しています.

現状よくわからなくて悩んでいるのは次の 2 つです:

  • そもそも (a), (b) どちらを採用するか? 切替可能とする場合,フォント読み込み時に feature の形で指定する以外の方法はあるか?
  • (b) を採用した場合,どう実装するか?
    • vrt2 より vert を優先させる?
    • 「正立させる文字の範囲」はどう定める? UAX#50 との兼ね合い?

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする