我正在使用一个包 ( 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\node
s 嵌入树中(上面的注释代码),但这不起作用:
我读过的其他一些答案建议用 替换嵌套的/ \tikz
,但这似乎对我的情况不起作用,因为s 需要嵌入到 LaTeX 命令的深处。不那么重要的是,我认为嵌入式s 的代码更方便用户使用。tikzpicture
fit
\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}