Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
h-kitagawa opened this issue Mar 5, 2024 · 2 comments

Comments

@h-kitagawa
Copy link
Member

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 と同様の機能を実現できないものでしょうか.

Footnotes

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

@h-kitagawa
Copy link
Member Author

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

  • 介入する箇所の候補として,a. ノードリストから dvi への変換(エンジン)と b. dvi から pdf への変換 (dvipdfmx) がある
  • tfm に 32 番の文字があっても,それが pdf で使われる実フォントの空白文字に対応するとは限らない (eg. OT1, T1).
    →a. のみではうまくいかない
  • 「空白」の要因としては通常の欧文単語間空白以外にも,明示的な \hskip,JFM グルー,\kanjiskip, \xkanjiskip などがある.しかし,dvi では空白は参照点の移動で表現されるため,「原因」の情報が消えてしまう.
    →b. のみでもうまくいかない

とりあえず頭の中での案です.

  • エンジン側では,dvi 生成の際に「このグルーの箇所に pdf では空白文字を入れる」ことを示すマーカーを含める
  • dvipdfmx では,上記のマーカーを見つけたら「現在のフォントに空白文字があれば空白文字を出力,空白文字がなければダミーのフォントで……」という挙動を行う.
  • マーカーをどうするかは悩み中.dvi の opcode は増やしたくはない.\special か,putn 命令に「文字コードとして変」な値を与えたものにするか?

@h20y6m
Copy link
Collaborator

h20y6m commented Mar 5, 2024

  • 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 か,put_n_ 命令に「文字コードとして変」な値を与えたものにするか?

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants