次の例は非標準的な濁点付き仮名の出力を、単独の濁点文字〈゛〉(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}ェアアアア
というわけでパッケージを作った。
- pxjaschar.sty (gist)
このパッケージは命令 \*
を再定義していて、(非数式で)\*○゛
および \*○゜
(○
は和文文字)と書くことで濁点および半濁点付きの文字を出力できる。(数式モードでは本来の動作に戻る。*2)
\documentclass[a4paper]{jsarticle} \usepackage{pxjaschar} \begin{document} \*イ゛ェアアアア!\par \*ら゜\*ら゜\*ら゛〜♪\par \end{document}