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특정 위치에 일부 텍스트를 배치하는 데 사용됩니다. 그렇게 하는 방법에는 두 가지가 있습니다.

  • \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@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-shift의 차원입니다.
  • 그래서 \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);
    

관련 정보