マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

和文を箱に詰め込む、別の話

前回に続いて、和文の調整絡みで混乱する例の話。

次の例は非標準的な濁点付き仮名の出力を、単独の濁点文字〈゛〉(1区11点;U+309B)を位置調整して出力することで実現しようとした例である。(以下、水平モードでの実行を仮定する。)

\hbox to 1zw{イ゛}ェアアアア

一見上手くいっているように見えるかも知れないが、よく考えてみたら全くおかしい。上のコードでは 2 文字を 1zw に収めることで〈イ〉と〈゛〉の間を縮めようとしているので、この 2 つの字の間にグル―があることを想定しているはずである。確かにそれ自体は正解で、2 つの字の間には和文間グル―(\kanjiskip)が存在する。しかし、このグル―はほとんど縮まないのである。

  • jarticle クラスでの既定値は 0pt plus 0.4pt minus 0.5pt。
  • jsarticle クラスでの既定値は 0pt plus 0.1zw minus 0.01zw (サイズに応じて可変)。現在フォントサイズが 10pt の場合、縮み幅は 0.0924pt。

そもそもこの縮み幅は実際に行分割の時に考慮されるものだから、「字が重なる」効果をもつほど縮むことはあり得ない。それに、もし「本当に 1zw の幅に収まった」とすると、濁点はベタに組んだ時と比べると、「その文字幅」(jis 系の和文フォントでは全角、min10 系では約三分)だけ左に動くので、次のような出力になるはずである。((\hbox to 1zw{イ\hss ゛} とするとこの出力が再現できる。))

ここから判ることは、本当は 1zw の幅に収めることは失敗していたということである。実際、次のようなオーバーフルの警告が出ている。

Overfull \hbox (9.15446pt too wide) detected at line 10
\JY1/mc/m/n/10 イ ゛

適切な出力を得るには、\kanjiskip に頼ったりせずに、予め適切な値を決めてそれだけ濁点を動かすことが必要である。本当に最適な値は実際に用いられる和文フォントに依存するが、例えば四分にしてみよう。

\hbox to 1zw{イ\kern-0.25zw\relax ゛}ェアアアア

このままでは不適切である。文字の間に明示的グル―を入れたので、そこにはもう伸縮するグル―は存在しない(というかこれに頼ってはいけない)ので、例えば jis 系の場合、箱の中身は伸縮なしの 1.75zw となる。ここでは右側にはみ出た部分(〈゛〉のグリフ右側に含まれる空白)を削る必要があるのでそこに \hss を入れる。*1

\hbox to 1zw{イ\kern-0.25zw\relax ゛\hss}ェアアアア

というわけでパッケージを作った。

このパッケージは命令 \* を再定義していて、(非数式で)\*○゛ および \*○゜和文文字)と書くことで濁点および半濁点付きの文字を出力できる。(数式モードでは本来の動作に戻る。*2

\documentclass[a4paper]{jsarticle}
\usepackage{pxjaschar}
\begin{document}
\*イ゛ェアアアア!\par
\*ら゜\*ら゜\*ら゛〜♪\par
\end{document}

*1:削る空白の幅は min10 と jis で異なることに注意。

*2:それが何かを知っている人は少なそう…。