Ticket #30501

fontspec 読み込み時のチルダのアキ

Open Date: 2013-01-14 11:27 Last Update: 2013-01-31 19:23

Reporter:
Owner:
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
1

Details

fontspec が読み込まれていると,和文文字とチルダの間にスペースが挿入されている(?)のか妙にアキが大きくなります.

\documentclass{ltjarticle}
\usepackage{fontspec}
\begin{document}
あああ~1~2あ~あ.
\end{document}
あ'と1',あ'とあ'の間が広く空きます.fontspec を読み込まない場合は大丈夫みたいです.

Ticket History (3/8 Histories)

2013-01-14 11:27 Updated by: kmaeda
  • New Ticket "fontspec 読み込み時のチルダのアキ" created
2013-01-14 12:11 Updated by: h7k
Comment

ほんとだ,1 と 2 の間も広いように見えます.

とりあえず \showbox してみたところ,

\box0=
\hbox(7.77591+1.38855)x82.73315, direction TLT
.\hbox(7.77591+1.38855)x9.6222, direction TLT
..\JY3/mc/m/n/10 あ
.\glue 0.0 plus 0.4 minus 0.4
.\hbox(7.77591+1.38855)x9.6222, direction TLT
..\JY3/mc/m/n/10 あ
.\glue 0.0 plus 0.4 minus 0.4
.\hbox(7.77591+1.38855)x9.6222, direction TLT
..\JY3/mc/m/n/10 あ
.\glue 2.40555 plus 1.0 minus 1.0
.\EU2/lmr/m/n/10  
.\EU2/lmr/m/n/10 1
.\EU2/lmr/m/n/10  
.\EU2/lmr/m/n/10 2
.\glue 2.40555 plus 1.0 minus 1.0
.\hbox(7.77591+1.38855)x9.6222, direction TLT
..\JY3/mc/m/n/10 あ
.\glue 2.40555 plus 1.0 minus 1.0
.\EU2/lmr/m/n/10  
.\glue 2.40555 plus 1.0 minus 1.0
.\hbox(7.77591+1.38855)x9.6222, direction TLT
..\JY3/mc/m/n/10 あ
となりました. 本来入るはずの \penalty10000\glue 3.33 plus 1.665 minus 1.11 の代わりに EU2 の半角空白文字が入っているようです.

2013-01-14 13:31 Updated by: kmaeda
Comment

fontspec(というか xunicode)を読み込むと \nobreakspace の定義が変更されるのが原因でしょうか.

> \nobreakspace=macro:
->\EU2-cmd \nobreakspace \EU2\nobreakspace .
l.4 \show\nobreakspace

xunicode.sty に

\DeclareUTFcharacter[\UTFencname]{x00A0}{\nobreakspace}
というのがあります.U+00A0 は NBSP みたいです.

2013-01-14 14:21 Updated by: h7k
  • Owner Update from (None) to h7k
Comment

fontspec(というか xunicode)を読み込むと \nobreakspace の定義が変更されるのが原因でしょうか.

\EU2\nobreakspace ->\?-\nobreakspace が,何らかの原因で \EU2\nobreakspace ->\ltjalchar "00A0\relax に置き換えられてしまうのが原因のようです.

\EU2\nobreakspace の定義を commit d79ca27 で元のものに戻すようにしてみました.これでうまくいってそうな気がしますが…….

2013-01-14 14:44 Updated by: kmaeda
Comment

\EU2\nobreakspace の定義を commit d79ca27 で元のものに戻すようにしてみました.

確認しました.自分の試した範囲では問題なさそうです.

2013-01-19 12:05 Updated by: h7k
  • Resolution Update from None to Fixed
Comment

\EU2\nobreakspace の定義を commit d79ca27 で元のものに戻すようにしてみました.

確認しました.自分の試した範囲では問題なさそうです.

よかった.ひとまず「修正済み」としておきました.

\EU2\nobreakspace ->\?-\nobreakspace が,何らかの原因で \EU2\nobreakspace ->\ltjalchar "00A0\relax に置き換えられてしまう

xunicode-reload-nobreakspc.tex のように,fontspec + \ReloadXUnicode{EU2} という環境下でも同じような状況が起こるようです (xunicode.sty 0.981).


xunicode.sty 中の \check@hexcom@digits@ のコードを見てみると,次のようになっています. (fontspec ロード時の実行を「1回目」,\ReloadXUnicode による実行を「2回目」と書きます.)

まず,\expandafter\def\csname\UTFencname\string#8\endcsname{\char"#1#2#3#4\relax} (l.249) によって,

{{\EU2\nobreakspace ->\char "00A0\relax}}} という定義になる(1, 2 回目とも)

次に,256--261 行目の

{% macro #8 exists already ...
      \let\protect\noexpand
      \edef\UTF@testi{#8}\def\UTF@testii{#8}%
      \ifx\UTF@testi\UTF@testii\aftergroup\UTF@ignore
      \else\aftergroup\UTF@doit\fi
     }%
という block において,

  • 1回目では \UTF@testi -> \nobreakspace , \UTF@testii -> \nobreakspace となり(空白の個数に注意.前者は2個,後者は1個),if 文は false となる. その結果,\UTF@doit のおかげで直後の
        \iffalse % ←これは \UTF@doit が吸収する
          % ... but when it isn't robust, make it so
          ...
         \fi
    
    へと制御が移り,\EU2\nobreakspace ->\?-\nobreakspace と定義が変わる.
  • 一方,2 回目では,\UTF@testi -> \nobreakspace , \UTF@testii -> \nobreakspace (空白はどちらも1個)となり,if 文は true となる. そのため,{{\EU2\nobreakspace ->\char "00A0\relax}}} のままとなる.

なお,\UTF@ignore, \UTF@doit の定義は

% indirect conditionals, to avoid unbalance when reloaded
\def\UTF@ignore#1{\csname iffalse\endcsname}
\def\UTF@doit#1{\csname iftrue\endcsname
となっています.

2013-01-31 19:23 Updated by: h7k
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2013-01-31 19:23
Comment

完了としておきます.

Attachment File List

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login