繪製森林樹圖中的節點與其外在事物之間的連接

繪製森林樹圖中的節點與其外在事物之間的連接

forest我在將樹狀圖內部的節點與其外部的任意文字連接起來時遇到問題。


微量元素:

\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}

這應該在 TeXLive 2016 下成功編譯xelatex(對於 Unicode 支援):

具有解決方法定義的 MWE 編譯

相關內容