tikzmark と xelatex

tikzmark と xelatex

tikzmark と xelatex に問題があるようです。xetex メーリングリストの Ulrike Fischer がこの問題の解決に協力してくれました。次のコードは xelatex でコンパイルすると動作しませんが、pdflatex でコンパイルすると期待どおりの結果が生成されます。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}


\begin{document}

x\pgfmark{tA}some text \pgfmark{tB} some text
\begin{tikzpicture}[remember picture]
\draw (0,0)node (A){A} rectangle (1,1)node (B){B};
\end{tikzpicture}
\begin{tikzpicture}[remember picture]
\draw (0,0)node {\pgfmark{nA}} rectangle (1,1)node {\pgfmark{nB}};
\end{tikzpicture}

\vspace{3cm}\centering
\begin{tikzpicture}[overlay,remember picture]
\draw[red,->] (0,0)--(pic cs:tA) (0,0)--(pic cs:tB);
\draw[blue,->](0,0)--(pic cs:nA) (0,0)--(pic cs:nB); %nB faulty
\draw[green,->](0,0)--(A) (0,0)--(B);
\end{tikzpicture}

\end{document} 

これを簡単に解決する方法はありますか? この問題は、texlive 2013 から texlive 2014 にアップグレードした後に発生しました。

編集:元のコードが使用されています\subnodeが、これも機能しません:

\documentclass{article}
\usepackage{forest}

\usetikzlibrary{tikzmark}


\begin{document}


\begin{forest}
[V
[\subnode{ap1}{AP}
[ungewaschen]]
[V{[ \subnode{arg11}{1}, \subnode{arg12}{2} ]}
[isst]]]
\end{forest}
\begin{forest}
[V
[\subnode{ap2}{AP}
[ungewaschen]]
[V{[\subnode{arg21}{1} ]}]]
\end{forest}
\begin{tikzpicture}[overlay,remember picture]
%% this works with tikzmark
%% \draw[->, bend angle=40, bend left] ($(pic cs:ap1)+(1ex,2ex)$) to($(pic cs:arg11)+(1ex,2.5ex)$);
%% \draw[->, bend angle=40, bend left] ($(pic cs:ap1)+(1ex,2ex)$) to($(pic cs:arg12)+(1ex,2.5ex)$); % 1ex links, 2ex hoch
%% %
%% this used to work with subnode in texlive 2013 but is broken now
%% \draw[->, bend angle=40, bend left] ($(pic cs:ap2)+(1ex,2ex)$) to($(pic cs:arg21)+(1ex,2.5ex)$);
\draw[->, bend angle=40, bend left] (ap1.north) to (arg11.north);
\draw[->, bend angle=40, bend left] (ap1.north) to (arg12.north); 
%
\draw[->, bend angle=40, bend left] (ap2.north) to (arg21.north);
\end{tikzpicture}


\end{document}

AP はそれぞれ 1 と 2 に接続されているはずですが、矢印が上向きになっています。

ここに画像の説明を入力してください

答え1

@UlrikeFischer と @AkiraKakuto のコメントに感謝します。


PGF では、コマンドを\pgfsys@hboxsynced使用して、指定された位置にテキストを配置します。これを行うには、次の 2 つの方法があります。

  • \hskip一生懸命働く\raise

  • PDF レンダラーに面倒な作業を任せましょう。


LaTeX を使用する場合、最初の方法でpgfsys-pdftex.def実装します\pgfsys@hboxsynced。また、@AkiraKakuto が示唆したように、 の実装でpgfsys-common-pdf-via-dvi.defも最初の方法が使用されます。

ただし、XeLaTeX を使用すると、 の実装は2 番目の方法を使用する によってpgfsys-common-pdf-via-dvi.def上書きされます。これで、すべてのテキストがいくつかの位置情報とともに原点に配置されます。PDF レンダラーはこれらの情報を認識し、それらのテキストを適切な場所に移動します。ただし、マークしているのは原点であるため、 やその他のマーキング マクロは機能しなくなります。pgfsys-dvipdfmx.def\tikzmark


\pgfsys@hboxsyncedXeLaTeX に関する多くの知識を必要とするものの、自分で実装できるにもかかわらず、位置情報をいじってみることにします。

位置情報は によって処理されることに注意してください\pgfsys@transformcm。したがって、次のように試すこともできます。

\let\temp=\pgfsys@transformcm
\def\pgfsys@transformcm#1#2#3#4#5#6{
    \rememberxshift{#5}
    \rememberyshift{#6}
    \temp{#1}{#2}{#3}{#4}{#5}{#6}
}

そして、\tikzmarkその情報に基づいて、マーキング マクロを修正できます。


より技術的な詳細

  • \pgf@pt@xx シフトの次元です。
  • したがって、\hskip\pgf@pt@x最初の方法に属します。
  • 一方、、、などは\pgflowlevelsynccm2\pgfsys@invoke番目\specialの方法に関連しています。
  • 簡単な例を挙げると
    \tikz[overlay]\node[xshift=100]{Some \pgfmark{X} Text};
    \tikz[overlay,remember picture]\draw(pic cs:X)circle(.1);
    
  • さらに簡単な例を挙げると(私たちは の中にさえいませんpgfpicture
    \newbox\mybox
    \setbox\mybox=\hbox{Some \pgfmark{Y} Text 2}
    \pgftransformxshift{100}
    \pgfsys@hboxsynced\mybox
    
    \tikz[overlay,remember picture]\draw(pic cs:Y)circle(.1);
    

関連情報