白屋書房Blog

組版・縦書きサイト「白屋書房」のブログです

激闘TeX:文字と記号のタテヨコ

 筆者はド素人ですが、ド素人なりにサイトのページには可能な限り分かりやすく、こうすればいいという結論を書くように心がけています。ですがもちろんそこに至るまでにものすごく迷走したり試行錯誤しています。
 失敗の繰り返しなのでサイトやQiitaみたいなところには上げられないし、ということで、自分用の備忘録として、そういうTeXとの死闘の記録や詳しい解説をここに書いていこうと思います。
(環境はすべてupLaTeX、ファイルの文字コードUTF-8です)

 さて アクセントと特殊記号 後編 では「アクセントつきアルファベットや全角扱いになってしまう記号を、“コマンドなしのベタ書きで”欧文扱いの横倒しで組ませる」ということをやりました。
 基本的には記事で書いた通りZRさんのpxcjkcatパッケージを使うんですが、思い通りの挙動にするまでがけっこう長かったです。

 とりあえず「upLaTeX でアクセント付きのラテン文字などがうまく出力されないときの対処法」を参考に一番シンプルな設定にしてみると、下の例ではハートが出てくるところでつまづきました。

\documentclass{utbook}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage[prefernoncjk]{pxcjkcat}  %これだけ
\begin{document}
cassino de la jetée de Nice
†‡©£§¶«ギュメ»{\copyright}{\pounds}  %一般的な西欧語の文章で使う記号
♡☆♪※●▲■‼  %日本語の小説で使いそうなやつ
Братья Карамазовы  %ロシア語を使いたくなった時のために
Μοιρα  %サンホラーのために
\end{document}

 改めて先ほどの記事の補遺や、「[改訂新版]upLaTeXを使おう」の 欧文のUTF-8入力との併用 などをよく読んでみると、これはprefernoncjkモードが『漢字・かな・ハングル等の明らかな「CJK文字」以外は全て欧文扱いに』してしまうからのようです。
 CJK文字の具体的な範囲はREADMEによると、

  • kanji: 漢字・部首・注音字母: hani, haniA, haniB, haniC, hani1, hani2, cjk01, cjk02, cjk03, cjk05, cjk06, bopo, bopo1.
  • kana: ひらがな・カタカナ: hira, kana, kana1.
  • cjk: CJK 記号の一部・全角/半角互換形・彝文字: cjk04, cjk08, cjk07, cjk09, cjk10, cjk11, cjk12, cjk13, sym15, yiii, yiii1.
  • hangul: ハングル完成形・ハングル字母: hang, hang1, hang2, hangA, hangB.

 本文2行目までは全てASCII及びT1・TS1エンコーディングに含まれるいわゆる“半角”記号なので、inputencを通してLaTeXネイティブ命令に変換される1か、でなければtextcompが適切に取り扱ってくれます。
 ポイントなのが"cjk"ブロックで、3行目からはそこに含まれない(もちろんTS1にもない)ので扱いきれずにエラーを吐くみたいでした。

 解決策は\cjkcategory命令の第1引数に和文扱いしたいブロックを全部書いてやることなんですがうん、ちょっと待って。日本語の小説で使うには分が悪すぎる。
 たとえば用例として挙げられている○や▲や□は「Geometric Shapes」に属するのでIDはsym18になります。
 ところがここにハートはありません。♡や☆や♪は「Miscellaneous Symbols」(sym19)に入ります。
 これら及び必要な記号ブロックをcjk扱いにしてやっても他の文字は全部欧文扱いなので、ダッシュの位置がずれるとか縦向きにしたいまで横向きになるとかそれゆえの問題が残ります。(ダッシュは間が繋がったから位置さえマトモなら是非使いたかったんだけど…)

 あと愕然としたのが†‡ダガー・ダブルダガー)と(パラグラフ)と§(セクション)。¶と§がLatin-1 Supplementに入ってるのでてっきりダガーもだと思ったのに、何故かこいつらだけ「General Punctuation」に入ってる。
 prefernoncjkモードならGeneral~も欧文扱いになってるんだから別にいいかというとそうでもなくて、さらに愕然としたこともGeneral Punctuationに入っているんですよ。米印が欧文扱いになってちょっと小さめに表示された時は驚いた。てっきり日本の記号だと思ってた。

f:id:isaribisaitoh:20171010203241j:plain
衝撃

 なのでダガーのみを横倒しにして他は和文扱いというようなことはできません。さらに恐ろしいことに×と÷はLatin-1 Supplementに入っていたりするのでこれも分離できません。(「Latin-1 Punctuation and Symbols」というスクリプトがあって本当に約物だけなので、これを使えば算術記号と分けて定義できそうなんだけど多分upLaTeX側で使えない)
 どうすりゃいいんだよ!必要な記号だけ横倒しできないのかよ!

 ……でえーと、私は何をしたかったんだっけ。そうそう、フランス語をきちんと表示したかったんだった。
 正直これだけの用途なら「アルファベット類のみ欧文扱いにして他は全部和文扱い」にした方が早かったです。prefernoncjkモードをやめてprefercjkvarモードを使い、欧文扱いしたいブロックを追加することにします。

\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage[prefercjkvar]{pxcjkcat}  %アルファベット・ギリシャ・キリル文字のみ欧文扱いに
\cjkcategory{latn1}{noncjk}  %そこにLatin-1 Supplementを加える

 それであとはもう文体に合わせて運用していくしかなさげです。外国語が、出てきてもせいぜい仏・独・西ぐらいという人は上の設定で充分でしょう。
 逆にルーマニア語だのベトナム語だのをガリガリ使いたい人はprefernoncjkで、\cjkcategory{sym18,sym19,<あとsym04とかsym08あたり>}{cjk}をプラスしてやればだいたいなんとかなると思います。

 そしてここまでやってもなお立ちはだかるギリシャ語とキリル文字の壁。長くなったので次回に回します。