
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
用於在指定位置放置一些文字。有兩種方法可以做到這一點:
\hskip
與和 一起努力工作\raise
;告訴 PDF 渲染器為您做這些骯髒的工作。
使用LaTeX時,按第一種方法pgfsys-pdftex.def
實作。\pgfsys@hboxsynced
正如 @AkiraKakuto 所建議的,中的實作pgfsys-common-pdf-via-dvi.def
也使用第一種方法。
然而,當使用 XeLaTeX 時,中的實作pgfsys-common-pdf-via-dvi.def
被 覆蓋pgfsys-dvipdfmx.def
,它使用第二種方法。現在所有文字都與一些定位資訊一起放在原點。 PDF 渲染器將識別這些資訊並將這些文字移至正確的位置。但是\tikzmark
,任何其他標記巨集將不再起作用,因為您標記的是原點。
儘管我們可以\pgfsys@hboxsynced
自己實現,這需要大量有關 XeLaTeX 的知識,但我們可能會使用定位資訊。
請注意,定位資訊是由 處理的\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@x
是 x 位移的尺寸。- 所以
\hskip\pgf@pt@x
屬於第一種方法。 - 另一方面,諸如
\pgflowlevelsynccm
,\pgfsys@invoke
,\special
, 之類的任何內容都與第二種方法有關。 - 一個最小的例子是
\tikz[overlay]\node[xshift=100]{Some \pgfmark{X} Text}; \tikz[overlay,remember picture]\draw(pic cs:X)circle(.1);
- 一個更簡單的例子是(我們甚至不在 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);