
Кажется, есть проблема с tikzmark и xelatex. Ульрике Фишер из списка xetex помогла отследить это. Следующий код не работает при компиляции с 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}
Точка доступа должна быть подключена к контактам 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);
- Еще более простой пример (мы даже не внутри
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);