
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-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);