我设法在 Inkscape 中制作了这个大图表,并使用插件在 LaTeX 中添加了代码textext
。请参阅此问题了解更多信息。
我希望知道如何在 PGF/TikZ 的帮助下绘制关于对偶线性空间的大图。
更新。
就像我说的,我可以在 Inkscape 中制作这个图。但是当我发布 StackExchange 时,你可以看到,她的分辨率很低。这个图中的 PDF 文档具有令人满意的分辨率。但在 StackExchange 的网站上,分辨率并不好。
我相信使用 Tikz 包可以解决这个问题。所以我在这里发布了这个问题。
在下面的评论中: 很快我的问题是:
如果我使用 Inkscape,我可以控制每个节点中圆弧的起点和终点的位置。但分辨率会降低。
如果像往常一样使用 TikZ 命令,我将失去对每个节点的端点和初始弧的位置的控制。对于 TikZ 包,每个弧的端点和初始位置在 TikZ 包中预定义。
问题:如何解决这个问题呢?
答案1
以下是一些帮助您开始使用该positioning
库的内容tikz
解释
node
我首先在图片的中心设置一个\node(atcenter) at (0,0) {Center};
其余所有内容均相对于此位置指定
node
- 一旦设置了节点,您就可以使用循环连接它们
\foreach
;这将允许以后更轻松地进行更改 - 也许您希望连接全部为blue
,或者thick
,或者其他。 - 唯一“棘手”的节点是有多行的节点;你会注意到我
tabular
为此使用了,尽管这可能不是绝对必要的 atsouthwest
和之间的联系west
并不完全像你图片中的那样,但我必须留下一些东西让你研究:)
完整代码
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
% set up the nodes
\node(atcenter) at (0,0) {Center};
\node(atnorth) [above=of atcenter]{North};
\node(ateast) [right=of atcenter]{East};
\node(atnortheast) [above=of ateast]{North East};
\node(atsoutheast) [below=of ateast]{South East};
\node(atwest) [left=of atcenter]{West};
\node(atsouth) [below=2cm of atcenter]{South};
\node(atsouthwest) [left=4cm of atsoutheast,draw=black,rounded corners=2ex]{\begin{tabular}{@{}c}South West\\Second row\end{tabular}};
% connect the nodes, which is a perfect job
% for a loop
\foreach \first/\second in {atcenter/atnorth,
atcenter/ateast,
ateast/atnortheast,
atsoutheast/ateast,
atcenter/atsoutheast,
atnorth/atnortheast,
atwest/atnorth,
atcenter/atsouth,
atsouthwest/atsoutheast,
atwest/atcenter}{%
\draw[->] (\first) -- (\second);
\draw (atsouthwest) to[out=90,in=180] (atwest);
}
\end{tikzpicture}
\end{document}
答案2
我认为,正如 OP 所提到的,问题的一部分在于箭头的起点和终点所需的定位,虽然默认情况下非常灵活,但(据我所知)在这种情况下需要一些额外的工作才能使事情顺利进行。
对于节点定位,我会选择矩阵。我以某种风格隐藏了线条图(有点粗糙)。有点像这样:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{shapes.misc}
\begin{document}
\tikzset{
up/.style args={from (#1) to (#2)}{
insert path={
([xshift=2ex]#1.north west) -- ([xshift=2ex]#2.south west)
}
},
down/.style args={from (#1) to (#2)}{
insert path={
([xshift=2ex]#1.south west) -- ([xshift=2ex]#2.north west)
}
},
along right/.style args={from (#1) to (#2)}{
insert path={
(#1.east) -- (#2.west)
}
},
down right/.style args={from (#1) to (#2)}{
insert path={
([xshift=3ex]#1.south west) -- (#2.north west)
}
},
up right/.style args={from (#1) to (#2)}{
insert path={
([xshift=3ex]#1.north west) -- (#2.south west)
}
}
}
\begin{tikzpicture}[>=stealth]
\matrix
[
name=matrix,
matrix of math nodes,
row sep=0.5in,
column sep=0.5in,
ampersand replacement=\&,
nodes={anchor=west},
row 3 column 1/.style={
every node/.append style={%
shape=rounded rectangle,
draw,
xshift=-0.5in,
anchor=center,
inner xsep=-1ex,
name=f,
}
}]{
\& |(a)| AAAA \& |(b)| BBBB \\
|(c)| CCCC \& |(d)| DDDD \& |(e)| EEEE \\
\node{
\begin{array}{l}
F_{1,1}F_{1,2}F_{1,3} \\
\hskip2ex F_{2,1}F_{2,2}F_{2,3} \\
\hskip4ex F_{3,1}F_{3,2}F_{3,3} \\
\end{array}
};
\& \& |(g)| GGGG \\
\& |(h)| HHHH
\\};
\draw [->, up=from (d) to (a)];
\draw [->, up=from (e) to (b)];
\draw [->, up=from (g) to (e)];
\draw [->, down=from (d) to (h)];
\draw [->, along right=from (a) to (b)];
\draw [->, along right=from (c) to (d)];
\draw [->, along right=from (d) to (e)];
\draw [->, along right=from (f) to (g)];
\draw [->, down right=from (d) to (g)];
\draw [->, up right=from (c) to (a)];
\draw (f) |- (c);
\end{tikzpicture}
\end{document}