dvipdfmx での TikZ の patterns ライブラリサポートの不具合とその対処法

dvipdfmx での TikZ の patterns ライブラリサポートの不具合とその対処法

- Dora TeX の投稿
返信数: 1
pgfsys-dvipdfm.def は TikZ の patterns ライブラリをサポートしないが,pgfsys-dvipdfmx.def はサポートしているとのことでしたので,試してみたところ,次のような不具合を見つけました。

次のソースの [1]~[5] の行の,いずれか1行だけをコメントアウト解除して dvipdfmx にかけると,[1], [4], [5] では正しくパターンが塗られるのに対し,[2], [3] ではパターンが消えます。

\documentclass[dvipdfmx]{article}
\usepackage{tikz}
\usetikzlibrary{patterns}

\def\test{\tikz\filldraw[pattern=north east lines] (0,0) ellipse (2 and 1);}

\begin{document}
%[1] \test
[2] \setbox0\hbox{\test}\test
%[3] $\mathchoice{\test}{\test}{}{}$
%[4] \test\setbox0\hbox{\test}\test
%[5] \test$\mathchoice{\test}{\test}{}{}$
\end{document}

[2], [3] のときには,dvipdfmx が

dvipdfmx:warning: Object @pgfpatternobject3 used, but not defined. Replaced by null.

という警告を吐いています。

つまり,「初登場時のものが最終的な組版結果に現れず捨て去られる場合」に,パターン定義が消え去って null に置き換えられてしまうために,それ以降の使用時にもパターンが消失してしまっているようです。

pdfLaTeX や XeLaTeX ではこの問題は生じません。

dvipdfmx と事情が似ているはずの xdvipdfmx を使っている XeLaTeX で同じ問題が生じないことに注目して,pgfsys-xetex.def を参考にすればこの問題が解決できるのではないかと考えました。

その結果,次のように,\pgfsys@dvipdfmx@patternobj の定義を pgfsys-xetex.def のものに置き換えたところ,[2], [3] についてもパターンが正しく塗られることが分かりました。

\documentclass[dvipdfmx]{article}
\usepackage{tikz}
\usetikzlibrary{patterns}

\makeatletter
\def\pgfsys@dvipdfmx@patternobj#1{\pgfutil@insertatbegincurrentpagefrombox{#1}}
\makeatother

\def\test{\tikz\filldraw[pattern=north east lines] (0,0) ellipse (2 and 1);}

\begin{document}
%[1] \test
[2] \setbox0\hbox{\test}\test
%[3] $\mathchoice{\test}{\test}{}{}$
%[4] \test\setbox0\hbox{\test}\test
%[5] \test$\mathchoice{\test}{\test}{}{}$
\end{document}

理屈はよく分かっておりませんが,とりあえず対処法が見つかりましたので,ご報告しておきました。