
У меня возникли проблемы с соединением узла внутри 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: