
forest
트리 다이어그램 내부의 노드를 외부의 임의 텍스트와 연결하는 데 문제가 있습니다 .
MWE:
\documentclass[12pt,paper=a4]{scrartcl}
\usepackage[linguistics]{forest}
\usetikzlibrary{positioning}
% cf. http://tex.stackexchange.com/a/1912/60686
\tikzstyle{na} = [shape=rectangle,inner sep=0pt,text depth=0pt]
\begin{document}
\begin{forest}
[A, name=A
[B]
[C
[X, name=X]
[Y]
]
]
\draw[-latex,dotted] (A) to[out=west,in=west] (X);
\end{forest}
\tikzstyle{every picture}+=[remember picture]
\tikz\node[na](lorem){Lorem}; ipsum \tikz\node[na](abc){dolor}; sit \tikz\node[na](amet){amet};.
\begin{tikzpicture}[overlay]
\draw (X) to (abc);
\draw[-latex] (lorem) to[out=south,in=south] (amet);
\end{tikzpicture}
\end{document}
불행하게도 위 코드의 결과는 다음과 같습니다.
즉, tikz가 노드를 찾을 수 없는 것 같아서 노드를 노드에 X
연결하는 대신 선이 아무데도 연결되지 않습니다 . 사물을 연결하는 것이 내부에서 작동한다는 것을 보여주기 위해X
abc
어느 하나다이어그램또는텍스트에 화살표도 많이 그렸습니다.
\tikzstyle{every picture}+=[remember picture]
위의 줄을 넣으면 \begin{forest}
다양한 콘텐츠 상자와 그림이 모두 다른 페이지에 표시됩니다.
답변1
\tikzmark
트리 내부에서 사용할 때의 문제점은 forest
중첩 환경이라는 것입니다 tikzpicture
. 이는 때때로 작동하지만 절대 의존해서는 안 되며 항상 피해야 합니다(자신이 하고 있는 일을 실제로 알고 있고 작업할 때 모든 사소한 부분을 기꺼이 유지하지 않는 한). 깨집니다).
다행히도 그러한 경우를 대비해 tikzmark
제공됩니다 .\subnode{}
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
이것으로 문제가 해결됩니다.
여기서 기억해야 할 한 가지는 Forest는 특별한 좌표계를 사용한다는 것입니다 forest cs
. 그러나 forest
환경이나 \Forest
매크로 내에서만 이에 액세스할 수 있습니다. 이는 \Forest*
현재 그룹 외부(예: 내부에서)의 노드에 액세스할 수 있는 별표 매크로가 사용되는 경우에도 마찬가지인 것 같습니다.또 다른 forest
환경이나 Forest[*]
매크로.
전체 코드:
\documentclass{article}
\usepackage[linguistics]{forest}
\usetikzlibrary{tikzmark,arrows.meta}
\begin{document}
\begin{forest}
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
\draw [-Latex,dotted] (A) to[out=west,in=west] (X);
\end{forest}
Lo\tikzmark{lorem}rem ipsum do\tikzmark{abc}lor sit am\tikzmark{amet}et.
\begin{tikzpicture}[remember picture, overlay]
\draw [-Latex, red] (x) [out=-75, in=110]to ([yshift=1.5ex]{pic cs:abc});
\draw [-Latex] ({pic cs:lorem}) to[out=south,in=south] ({pic cs:amet});
\end{tikzpicture}
\end{document}
답변2
좋습니다. 완전성을 기하기 위해 이것은 제가 개선한 것입니다.CFR의 유용한 답변, 다음의 해결 방법을 고려하여기본적으로 동일한 주제에 대한 이전 질문에 대한 Stefan Müller의 의견. 거기에 언급되고 여기에 사용된 해결 방법은 불행하게도 기본적으로만 언급될 뿐 예가 제공되지는 않습니다.
\documentclass{scrartcl}
\usepackage[linguistics]{forest}
\usetikzlibrary{positioning, tikzmark, arrows.meta}
% WORKAROUND:
% Definition copied from /usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf-via-dvi.def
% Compare https://tex.stackexchange.com/q/229500 and comments!
\makeatletter
\def\pgfsys@hboxsynced#1{%
{%
\pgfsys@beginscope%
\setbox\pgf@hbox=\hbox{%
\hskip\pgf@pt@x%
\raise\pgf@pt@y\hbox{%
\pgf@pt@x=0pt%
\pgf@pt@y=0pt%
\special{pdf: content q}%
\pgflowlevelsynccm%
\pgfsys@invoke{q -1 0 0 -1 0 0 cm}%
\special{pdf: content -1 0 0 -1 0 0 cm q}% translate to original coordinate system
\pgfsys@invoke{0 J [] 0 d}% reset line cap and dash
\wd#1=0pt%
\ht#1=0pt%
\dp#1=0pt%
\box#1%
\pgfsys@invoke{n Q Q Q}%
}%
\hss%
}%
\wd\pgf@hbox=0pt%
\ht\pgf@hbox=0pt%
\dp\pgf@hbox=0pt%
\pgfsys@hbox\pgf@hbox%
\pgfsys@endscope%
}%
}
\makeatother
\begin{document}
\begin{forest}
[A, name=A
[B]
[C
[\subnode{x}{X}, name=X]
[Y]
]
]
\draw [-Latex,dotted] (A) to[out=west,in=west] (X);
\end{forest}
Lo\tikzmark{lorem}rem ipsum do\tikzmark{abc}lor sit am\tikzmark{amet}et.
\begin{tikzpicture}[remember picture, overlay]
\draw [-Latex, red] (x) [out=-75, in=110]to ([yshift=1.5ex]{pic cs:abc});
\draw [-Latex] ({pic cs:lorem}) to[out=south,in=south] ({pic cs:amet});
\end{tikzpicture}
\end{document}
xelatex
이것은 TeXLive 2016에서 (유니코드 지원을 위해) 성공적으로 컴파일되어야 합니다 :