Нарисуйте связь между узлом на диаграмме дерева леса и чем-либо за его пределами.

Нарисуйте связь между узлом на диаграмме дерева леса и чем-либо за его пределами.

У меня возникли проблемы с соединением узла внутри 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, принимая во внимание обходной путь вкомментарии к предыдущему вопросу по сути на ту же тему от Стефана Мюллера. Обходной путь, упомянутый там и использованный здесь, к сожалению, только упоминается, в основном, но не приводится пример.

\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(для поддержки Unicode) в TeXLive 2016:

Компиляция MWE с определением обходного пути

Связанный контент