
Es scheint ein Problem mit Tikzmark und Xelatex zu geben. Ulrike Fischer von der Xetex-Liste hat geholfen, dies aufzuspüren. Der folgende Code funktioniert nicht, wenn er mit Xelatex kompiliert wird, erzeugt aber das erwartete Ergebnis, wenn er mit PDFlatex kompiliert wird:
\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}
Gibt es dafür eine schnelle Lösung? Das Problem trat nach dem Upgrade von Texlive 2013 auf Texlive 2014 auf.
Bearbeiten:Der Originalcode wurde verwendet \subnode
, funktioniert aber auch nicht:
\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}
Der AP sollte jeweils mit 1 und 2 verbunden sein, aber die Pfeile zeigen in die Luft.
Antwort1
Danke an @UlrikeFischer und @AkiraKakutos Kommentar.
In PGF \pgfsys@hboxsynced
wird der Befehl verwendet, um Text an einer bestimmten Position einzufügen. Dazu gibt es zwei Möglichkeiten:
arbeite hart mit
\hskip
und\raise
;Sagen Sie den PDF-Renderern, dass sie die Drecksarbeit für Sie erledigen sollen.
Wenn LaTeX verwendet wird, pgfsys-pdftex.def
wird die Implementierung \pgfsys@hboxsynced
mit der ersten Methode durchgeführt. Und wie @AkiraKakuto vorgeschlagen hat, verwendet die Implementierung pgfsys-common-pdf-via-dvi.def
ebenfalls die erste Methode.
Bei Verwendung von XeLaTeX pgfsys-common-pdf-via-dvi.def
wird die Implementierung in jedoch durch überschrieben pgfsys-dvipdfmx.def
, das die zweite Methode verwendet. Jetzt werden alle Texte zusammen mit einigen Positionierungsinformationen am Ursprung platziert. PDF-Renderer erkennen diese Informationen und verschieben die Texte an die richtige Stelle. \tikzmark
Alle anderen Markierungsmakros funktionieren jedoch nicht mehr, da das, was Sie markieren, der Ursprung ist.
Obwohl wir dies \pgfsys@hboxsynced
selbst implementieren können und dafür eine Menge Wissen über XeLaTeX erforderlich ist, können wir mit den Positionierungsinformationen herumspielen.
Beachten Sie, dass die Positionsinformationen von verarbeitet werden \pgfsys@transformcm
. Wir könnten also versuchen,
\let\temp=\pgfsys@transformcm
\def\pgfsys@transformcm#1#2#3#4#5#6{
\rememberxshift{#5}
\rememberyshift{#6}
\temp{#1}{#2}{#3}{#4}{#5}{#6}
}
Und dann können wir das \tikzmark
oder was auch immer Markierungsmakro anhand der Informationen korrigieren.
Weitere technische Details
\pgf@pt@x
ist die Dimension für die X-Verschiebung.- gehört also
\hskip\pgf@pt@x
zur ersten Methode. - Andererseits ist alles wie
\pgflowlevelsynccm
,\pgfsys@invoke
,\special
, mit der zweiten Methode verwandt. - Ein Minimalbeispiel ist
\tikz[overlay]\node[xshift=100]{Some \pgfmark{X} Text}; \tikz[overlay,remember picture]\draw(pic cs:X)circle(.1);
- Ein noch einfacheres Beispiel ist (wir sind nicht einmal in einem
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);