texjporg / tex-jp-build

Minimum source repository to build Japanese TeX processing tools
23 stars 6 forks source link

[ptex][dvipdfmx] pdf 内で空白を「テキスト情報の空白」として扱う #168

Open h-kitagawa opened 4 months ago

h-kitagawa commented 4 months ago

Slack での ZR さんの発言が元ですが,ここで考えたほうがいいと思ったので立てます. LaTeX project の[Report on the LaTeX Tagged PDF workshop, TUG 2023](Report on the LaTeX Tagged PDF workshop, TUG 2023) には,次のような記述があります(太字は北川による):

The recommended engine for tagging is luaLaTeX. For legacy documents pdfLaTeX is supported, ... Other workflows such XeLaTeX or LaTeX–dvips are not recommended as real space characters can’t be inserted in these cases.

太字で強調した部分は,pdfTeX でいうところの \pdfinterwordspaceon だそうです.

この流れが続けば「LaTeX(の全機能)がまともにサポートするのは pdfTeX or LuaTeX のみ」ということになりかねません[^1]. なんとか {u,n}pTeX/XeTeX + dvipdfmx で \pdfinterwordspaceon と同様の機能を実現できないものでしょうか.

[^1]: 以前からも pdfTeX/LuaTeX の方を向いているな,という印象がありましたが.2018-05-03 の Joseph Wright さんのメール とか.

h-kitagawa commented 4 months ago

まだコードは何も書いていませんが,思いついたことを.

h20y6m commented 4 months ago
  • tfm に 32 番の文字があっても,それが pdf で使われる実フォントの空白文字に対応するとは限らない (eg. OT1, T1).

「The TeX Live Guide」の 2023 年の変更点のところに以下のような記述がありました。

with \pdfinterwordspaceon, if the current font’s encoding has a /space character at slot 32, it is used; otherwise, the /space from the (new) default font pdftexspace is used. That default font can be overridden with the new primitive \pdfspacefont. This same new procedure is used for \pdffakespace.

TL2023 以降ではフォントの文字コード 32 が /space ではないときは pdftexspace フォントが使われるようです。 TL2022 までは常に dummy-space というフォントが使われていたよう。

  • 「空白」の要因としては通常の欧文単語間空白以外にも,明示的な \hskip,JFM グルー,\kanjiskip, \xkanjiskip などがある.しかし,dvi では空白は参照点の移動で表現されるため,「原因」の情報が消えてしまう.

pdftex の場合は `,\ ,\hskip,\kern,\hboxいずれでも「一定の空白」が入るときは空白文字が入るようです。 「一定の空白」は\fontdimen2\font-\fontdimen4\fontより少し大きい程度のようです。 それから、\ \ \ ` のように複数空白を入れても空白文字は一つだけのようです。 また、フォントが変更されるところには空白文字が入らないようです。

\pdfcompresslevel=0
\pdfinterwordspaceon
%\font\f=ptmr at 10pt\f
\immediate\write16{\the\fontdimen2\font-\the\fontdimen4\font=\the\dimexpr\fontdimen2\font-\fontdimen4\font\relax}%
abc def
%abc\ def
%abc\hskip2.23ptdef
%abc\kern2.23ptdef
%abc\hbox to2.23pt{}def
%abc\ \ \ def
%abc {\it def} ghi
%abc $d, e, f$ ghi
\bye

これらの挙動のすべてが意図したものなのか、実装上の都合かまでは分かりませんが、欧文 TFM に限れば dvipdfmx 側だけでもできそうな気はします。 ただの和文 JFM のことを考えるとどのみち ptex 側での対応も必要になりそう。 (あと xelatex で xeCJK パッケージで和文みたいなときに和文フォントと欧文フォント区別がないのでパッケージ側で対応しないといけなくなりそう)


  • マーカーをどうするかは悩み中.dvi の opcode は増やしたくはない.\special か,putn 命令に「文字コードとして変」な値を与えたものにするか?

dvipdfmx 以外の dviware への影響を最小限にするなら \special ですかね?