TikZ - 使用非 Tikz 命令来布局图片的一部分

TikZ - 使用非 Tikz 命令来布局图片的一部分

我正在使用一个包 ( semantic.sty),它使用 LaTeX(不是 TikZ)绘制一些半复杂的东西。我想使用相同的命令绘制 TikZ 图片的一部分,并将 TikZ 图片的部分嵌入其中。MWE:

\documentclass{article}

\usepackage{amsmath,semantic,tikz}

% \newcommand\tnode[2]{\tikz\node[anchor=text,inner sep=0](#1){$#2$};}

\begin{document}

\begin{center}
\begin{tikzpicture}
\node(C){$
\inference{
    \inference{
        A & B
%         A & \tnode{B}{B}
    }{A \wedge B} &
    \inference{
        C & D
    }{C \wedge D}
%     }{\tnode{CandD}{C \wedge D}}
}{(A \wedge B) \wedge (C \wedge D)}
$};
\node(N)[draw,above=.5in] at (C.north) {N};
\node(E)[draw,right=.5in] at (C.east) {E};
\node(S)[draw,below=.5in] at (C.south) {S};
\node(W)[draw,left=.5in] at (C.west) {W};
% \tikzset{every path/.style={draw,very thick}}
% \path[red] (N) to[out=-90,in=90] (B);
% \path[green] (E) to[out=180,in=0] (CandD);
\end{tikzpicture}
\end{center}

\end{document}

产生除了彩色线条之外的一切

带有模拟线条的乳胶输出

我想绘制连接节点和树各部分的模拟彩色线,也可能将树中的某些内容转换为 TikZ 节点(这样我就可以添加背景颜色、边框等)。

我能想到的最诱人的方法是将\tikz\nodes 嵌入树中(上面的注释代码),但这不起作用:

带有不正确行的乳胶输出

我读过的其他一些答案建议用 替换嵌套的/ \tikz,但这似乎对我的情况不起作用,因为s 需要嵌入到 LaTeX 命令的深处。不那么重要的是,我认为嵌入式s 的代码更方便用户使用。tikzpicturefit\tikz\tikz

更激烈的解决方案是在 TikZ 中重新实现 LaTeX 绘图命令,但这对我来说是最不理想的选择。

问题:实现此目的最干净的方法是什么,最好使用类似于上面(注释掉的)代码的语法?

答案1

嵌套 TikZ 图片通常不是一个好主意,因为外部图片的选项会被内部图片继承。在您的示例中,只需添加到外部 TikZ 图片(由内部图片继承)即可,remember picture这样两个图片就可以识别另一个图片。

不过,更好的方法是tikzmark通过 CTAN 包提供可访问的库tikzmark这为我们提供了

\subnode[<options>]{<name>}{<content>}

在文本周围创建一个伪节点。

请注意,该tikzmark库至少需要两次编译才能正常工作。


我还使用了positioning库和node distance键来提供更一致的指南针节点定位。

代码

\documentclass[tikz]{standalone}
\usepackage{semantic}
\usetikzlibrary{tikzmark,positioning}
\newcommand\tnode[2]{\subnode{#1}{$#2$}}
\begin{document}
\begin{tikzpicture}[remember picture, node distance=.5in]
\node(C){$
  \inference{
    \inference{A & \tnode{B}{B}}{A \wedge B}               &
    \inference{C &            D}{\tnode{CandD}{C \wedge D}}
  }{(A \wedge B) \wedge (C \wedge D)}
$};
\node[draw, above=of C] (N) at (C.north) {N};
\node[draw, right=of C] (E) at (C.east) {E};
\node[draw, below=of C] (S) at (C.south) {S};
\node[draw, left= of C] (W) at (C.west) {W};
\tikzset{every path/.style={draw,very thick}}
\path[red]   (N) to[out=-90,in=90] (B);
\path[green] (E) to[out=180,in=0]  (CandD);
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案2

一种可能性是\tikzmark将一些标记放置在所需的位置;然后选项remember picture, overlay允许将这些标记与其他元素一起使用:

\documentclass{article}
\usepackage{amsmath,semantic,tikz}

\newcommand\tikzmark[1]{%
  \tikz[remember picture,overlay]\coordinate (#1) {};}

\begin{document}

\begin{center}
\begin{tikzpicture}[remember picture]
\node(C){$
\inference{
    \inference{
        A & \tikzmark{b}B
    }{A \wedge B} &
    \inference{
        C & D
    }{C \wedge D\tikzmark{d}}
}{(A \wedge B) \wedge (C \wedge D)}
$};
\node(N)[draw,above=.5in] at (C.north) {N};
\node(E)[draw,right=.5in] at (C.east) {E};
\node(S)[draw,below=.5in] at (C.south) {S};
\node(W)[draw,left=.5in] at (C.west) {W};

\draw[red] (N) to[out=-90,in=90] ([xshift=5pt,yshift=10pt]b.north);
\draw[green] (E) to[out=180,in=-20] ([yshift=2pt]d);
\end{tikzpicture}
\end{center}

\end{document}

在此处输入图片描述

相关内容