我在 pstricks 中真正看重的功能之一(我早就改用 tikz 了,这是我唯一缺少的功能)是,我可以将任何片段指定为一个节点,然后将其连接到我周围的其他节点。
这是我在为我的讲座转换遗留代码时想到的一个具体例子。
\begin{tikzpicture}[yscale=1.5]
\node (love) at (2,0) {$\text{love}$};
\node (aform) at (0,1) {$\forall{X}\text{man}(X)\rightarrow\Box$};
\node (eform) at (4,1){$\exists{X}\text{woman}(X)\wedge\Box$};
\node (top) at (2,2) {$\Box$};
\draw[dashed,->] (top) --node[left] {1} (aform);
\draw[dashed,->] (top) --node[right] {2} (eform);
\draw[dashed,->] (aform.east) --node[left] {3} (love);
\draw[dashed,->] (eform.east) --node[rightl] {4} (love);
\end{tikzpicture}
但我在图片的最后两行中作弊了。我真正想要做的是将节点中的框链接aform
到eform
节点love
。pstricks
我只需使用\rnode
宏并执行类似操作 即可
\node (aform) at (0,1) {$\forall{X}\text{man}(X)\rightarrow\rnode{abox}{\Box}$};
\node (eform) at (4,1){$\exists{X}\text{woman}(X)\wedge\rnode{ebox}{\Box}$};
并简单地使用节点标签(现在又是纯 tikz)
\draw[dashed,->] (abox) --node[left] {3} (love);
\draw[dashed,->] (ebox) --node[rightl] {4} (love);
我尝试过各种方法,例如使用,\tizk[remember picture]\node (abox) {\Box};
但都无济于事。我很想学习如何做到这一点。
答案1
幸运的是,您可以使用标签,因为框位于末尾,但否则您必须将文本分成不同的节点(或使用更多标签)。
\documentclass{standalone}
\usepackage{tikz,amsmath,amssymb}
\begin{document}
\begin{tikzpicture}[yscale=1.5,label distance=-0.3em]
\node (love) at (2,0) {$\text{love}$};
\node[label={[name=aformlabel,anchor=base]0:$\Box$}] (aform) at (0,1) {$\forall{X}\text{man}(X)\rightarrow$};
\node[label={[name=eformlabel,anchor=base]0:$\Box$}] (eform) at (4,1){$\exists{X}\text{woman}(X)\wedge$};
\node (top) at (2,2) {$\Box$};
\draw[dashed,->] (top) --node[left] {1} (aformlabel);
\draw[dashed,->] (top) --node[right] {2} (eformlabel);
\draw[dashed,->] (aformlabel) -- node[left] {3} (love);
\draw[dashed,->] (eformlabel) -- node[right] {4} (love);
\end{tikzpicture}
\end{document}
答案2
更新 tikzmark
就是现在可在 CTAN 上获取并包含该\subnode
命令。
该软件包的最新版本tikzmark
(目前以测试版形式提供,网址为TeX-SX 启动板页面 - 下载tikzmark.dtx
并运行tex tikzmark.dtx
以创建必要的文件)有一个\subnode
命令,它应该可以执行您想要的操作。语法是\subnode{<name>}{<content>}
。它的作用有效是在 周围创建一个紧密贴合的矩形节点,content
名称为name
。它如何做到这一点并不重要,只是您需要使用remember picture
图片上的键来引用这个伪节点,并且需要两次运行才能稳定下来。如果您想要一个通常的节点或不同的形状,那么使用 fit 库在其周围放置一个节点,如\node[ellipse,fit=(othernode)] {};
。伪节点是紧密贴合的这一事实意味着它将与在正常情况下创建的大小相同。
这是实验性代码,因此请让我对其实用性或意外行为提供任何反馈。
\documentclass{article}
%\url{http://tex.stackexchange.com/q/83911/86}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz}
\usetikzlibrary{tikzmark,fit}
\begin{document}
\begin{tikzpicture}[remember picture]
\node (a) {this \subnode{b}{is} in a box};
\node at (0,-.5) (d) {this is in a box};
\node at (1,1) (c) {c};
\draw[->] (c) -- (b);
\node[fit=(b),draw,inner sep=0pt] {};
\draw[->] (a.north) to[bend right] (b.north);
\end{tikzpicture}
\begin{tikzpicture}[yscale=1.5,remember picture]
\node (love) at (2,0) {$\text{love}$};
\node (aform) at (0,1) {$\forall{X}\text{man}(X)\rightarrow\subnode{mbi}{$\Box$}$};
\node (eform) at (4,1){$\exists{X}\text{woman}(X)\wedge\subnode{wbi}{$\Box$}$};
\node (top) at (2,2) {$\Box$};
\node[fit=(mbi)] (mb) {};
\node[fit=(wbi)] (wb) {};
\draw[dashed,->] (top) --node[auto,swap] {1} (aform);
\draw[dashed,->] (top) --node[auto] {2} (eform);
\draw[dashed,->] (mb) --node[auto,swap] {3} (love);
\draw[dashed,->] (wb.240) --node[auto] {4} (love);
\end{tikzpicture}
\tikz[remember picture,overlay] \draw[->] (0,0) to[bend left] (b);
\end{document}
以上为您的图表生成以下内容(注释掉其他部分):