
Parece haver um problema com tikzmark e xelatex. Ulrike Fischer, da lista xetex, ajudou a descobrir isso. O código a seguir não funciona quando compilado com xelatex, mas produz o resultado esperado quando compilado com 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}
Existe uma solução rápida para isso? O problema apareceu após a atualização do texlive 2013 para o texlive 2014.
Editar:O código original usado \subnode
, mas também não funciona:
\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}
O AP deveria estar conectado em 1 e 2 respectivamente, mas as setas estão no ar.
Responder1
Obrigado ao comentário de @UlrikeFischer e @AkiraKakuto.
No PGF, o comando \pgfsys@hboxsynced
é usado para colocar algum texto em uma posição especificada. Existem duas maneiras de fazer isso:
trabalhar duro com
\hskip
e\raise
;diga aos renderizadores de PDF para fazerem o trabalho sujo para você.
Quando LaTeX é usado, pgfsys-pdftex.def
é implementado \pgfsys@hboxsynced
pelo primeiro método. E como sugeriu @AkiraKakuto, a implementação pgfsys-common-pdf-via-dvi.def
também usa o primeiro método.
No entanto, quando XeLaTeX é usado, a implementação pgfsys-common-pdf-via-dvi.def
é substituída por pgfsys-dvipdfmx.def
, que usa o segundo método. Agora todos os textos são colocados na origem junto com algumas informações de posicionamento. Os renderizadores de PDF reconhecerão essas informações e deslocarão esses textos para o lugar certo. Porém \tikzmark
e qualquer outra macro de marcação não funcionará mais porque o que você está marcando é a origem.
Apesar de podermos implementar \pgfsys@hboxsynced
por nós mesmos, o que requer muito conhecimento sobre XeLaTeX, podemos brincar com as informações de posicionamento.
Observe que as informações de posicionamento são processadas por \pgfsys@transformcm
. Então podemos tentar
\let\temp=\pgfsys@transformcm
\def\pgfsys@transformcm#1#2#3#4#5#6{
\rememberxshift{#5}
\rememberyshift{#6}
\temp{#1}{#2}{#3}{#4}{#5}{#6}
}
E então podemos corrigir a \tikzmark
macro de marcação ou qualquer outra macro pelas informações.
Mais detalhes técnicos
\pgf@pt@x
é a dimensão do deslocamento x.- então
\hskip\pgf@pt@x
pertence ao primeiro método. - por outro lado, qualquer coisa como ,,,,
\pgflowlevelsynccm
está relacionada ao segundo método.\pgfsys@invoke
\special
- Um exemplo mínimo é
\tikz[overlay]\node[xshift=100]{Some \pgfmark{X} Text}; \tikz[overlay,remember picture]\draw(pic cs:X)circle(.1);
- Um exemplo cada vez mais simples é (nem estamos dentro de a
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);