找回密码
 快速注册
搜索
查看: 1167|回复: 11

两个node连线,怎么才能好看点

[复制链接]

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

abababa 发表于 2021-1-8 21:18 |阅读模式
如题,我要弄一个定理之间互相推出、不能推出的图,目前代码如下:
  1. \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.0cm]
  2. \tikzstyle{every state}=[fill=none,draw=pink]
  3. \tikzstyle{hidden}=[fill=none,draw=none,text=white]
  4. \tikzset {
  5.         solid/.style={->, >=latex, shorten >=1pt, thick},
  6.         dotted/.style={->, >=latex, shorten >=1pt, dashed}
  7. }
  8. \node[state] (f) {定理1};
  9. \node[hidden] (hide) [left of=f] {};
  10. \node[state] (in) [left of=hide] {定理2};
  11. \draw[solid] (f.west) -- ++(0,+.25) to node{能推出} (in.east);
  12. \draw[dotted] (in.east) -- ++(0,+.25) to node{不能推出} (f.west);
  13. \end{tikzpicture}
复制代码
这个线现在我画得很不好,我就是想让它俩平行,然后一个箭头向左一个向右,一虚一实,然后能在箭头上、下标上文字。这个要怎么做才行?我发现还有一个edge是连接两个node的,但不知道怎么调位置,就是需要互相连接时,能全都是直线并且分开一点吗?

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2021-1-8 21:48
这段代码需要什么库你倒是说一下,我这里运行不了

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

 楼主| abababa 发表于 2021-1-8 22:18
回复 2# kuing
原来如此,我明白了,之前把那些包都放到其它文件里引用了。需要的如下:
  1. % tikz
  2. \usepackage{pgf,tikz}
  3. \usepackage{float}
  4. \usepackage{pgfplots,wrapfig}
  5. \usepackage{graphicx}
  6. \usepackage{subfigure}
  7. \usepackage{tkz-euclide}
  8. \usetikzlibrary{arrows,automata,positioning,calc,intersections,shapes.geometric}
复制代码

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2021-1-8 22:21
试试最后两句改成:
\draw[solid] (f.-150) to node{能推出} (in.-30);
\draw[dotted] (in.30) to node{不能推出} (f.150);

但是,如果两个圆不等大,线就不平行了……

这时候其实可以考虑改用弧线,像这样:
\draw[solid] (f) to[out=-170,in=-10] node{能推出} (in);
\draw[dotted] (in) to[out=10,in=170] node{不能推出} (f);

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

 楼主| abababa 发表于 2021-1-8 22:40
回复 4# kuing
谢谢,这个f.150里的150,表示的意思是什么呢?
下面那个弧线的以前也用过,我对那个出入角度一直弄不明白,很多次都是画完了会在node附近有一个明显的折,看上去很不光滑,但又不知道怎么调整。

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2021-1-8 22:52
回复 5# abababa

就是角度呗(相对于 node 的中心),0就是右边,180左,90上,-90下

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

 楼主| abababa 发表于 2021-1-9 10:17
回复 6# kuing

原来如此,那这样的话,即使两个圆半径不一样,也肯定会有一个角度让线平行啊,只是和不是180度了,得慢慢调才行。

15

主题

958

回帖

1万

积分

积分
12454

显示全部楼层

色k 发表于 2021-1-9 14:02
回复 7# abababa

我当然知道可以调,但那样就太麻烦了,万一圆里面的内容一修改变了大小又得再调,所以我才说改用弧线,那样就不需要调,就算调也不需要很精确,差不多就不会难看

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2021-1-9 15:49
对了,弧线的话也可以用 bend left 或 bend right:
/tikz/bend left=<angle>
This option sets out=<angle>,in=180 - <angle>,relative.
这里 relative 的意思是那角度是相对于两节点的方向,所以用这个更科学,那两个圆可以随便移。

测试代码:
  1. \documentclass{ctexart}
  2. \usepackage{tikz}
  3. \usetikzlibrary{arrows,automata}
  4. \begin{document}
  5. \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.0cm]
  6. \tikzstyle{every state}=[fill=none,draw=pink]
  7. \tikzstyle{hidden}=[fill=none,draw=none,text=white]
  8. \tikzset {
  9.         solid/.style={->, >=latex, shorten >=1pt, thick},
  10.         dotted/.style={->, >=latex, shorten >=1pt, dashed}
  11. }
  12. \node[state] (f) {定理1};
  13. \node[hidden] (hide) [left of=f] {};
  14. \node[state] (in) [above of=hide] {定理2};
  15. \draw[solid] (f) to[bend left=20] node{能推出} (in);
  16. \draw[dotted] (in) to[bend left=20] node{不能推出} (f);
  17. \end{tikzpicture}
  18. \end{document}
复制代码
捕获.PNG

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

 楼主| abababa 发表于 2021-1-9 17:19
回复 9# kuing

谢谢,这个更好用了。不过那个箭头线上的文字,能不能让它方向沿着箭头那样,比如如果箭头是竖着的,文本能不能也竖着排这样。感觉如果能这样,那这个不只能实现我现在这个定理互相推出的,还能实现其它很多东西。这个最初的代码就是从网友的一个什么状态图里拿出来的,他好像起初就是实现了状态图,然后把一部分拿出来给我了。

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2021-1-9 18:54
回复 10# abababa

node 的时候加个 sloped 好了,但有时还需要指定位置,不指定的话好像总是在上方。

\draw[solid] (f) to[bend left=20] node[sloped,below]{能推出} (in);
\draw[dotted] (in) to[bend left=20] node[sloped]{不能推出} (f);

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

 楼主| abababa 发表于 2021-1-9 22:13
回复 11# kuing

原来如此,果然好用,谢谢。

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:10

Powered by Discuz!

× 快速回复 返回顶部 返回列表