我想在 xymatrix 或 tikz 中绘制下图,用交叉点代替虚线箭头。我绘制了这张 tikz,但不知何故无法完成交叉。
任何帮助将不胜感激。
\begin{figure}[hbt]
\centering
\scalebox{0.6}
{
\begin{tikzpicture}[scale=5]
\tikzstyle{vertex}=[circle,minimum size=20pt,inner sep=0pt]
\tikzstyle{selected vertex} = [vertex, fill=blue!24]
\tikzstyle{selected edge} = [draw,line width=1pt,-,blue!50]
\tikzstyle{edge} = [draw,line width=3pt,-,white]
\node[vertex] (v1) at (0,2) {$K(V,0)$};
\node[vertex] (v2) at (1, 2) {$\binom{V_1}{V}$};
\node[vertex] (v3) at (0.33, 1.66) {$\binom{V_2}{V}$};
\node[vertex] (v4) at (0,1) {$\binom{V_3}{V}$};
\node[vertex] (v5) at (0.33,0.66) {${\begin{psmallmatrix} V_{23}\\
V_2\oplus V_3\\ V
\end{psmallmatrix}}$};
\node[vertex] (v6) at (1,1) {${\begin{psmallmatrix} V_{13}\\
V_1\oplus V_3\\ V
\end{psmallmatrix}}$};
\node[vertex] (v7) at (1.33, 0.66) {${\begin{psmallmatrix} V_{12}\oplus V_{13}\oplus V_{23}\\
V_1\oplus V_2 \oplus V_3\\ V
\end{psmallmatrix}}$};
\node[vertex] (v8) at (1.33, 1.66) {${\begin{psmallmatrix} V_{12}\\
V_1\oplus V_2\\ V
\end{psmallmatrix}}$};
\node[vertex] (v9) at (0.7, 1.8) {$\binom{V_1\oplus V_2}{V}$};
\node[vertex] (v10) at (0.6,1.2) {$\binom{V_1\oplus V_3}{V}$};
\node[vertex] (v11) at (0.17,1.23) {$\binom{V_2\oplus V_3}{V}$};
\draw[-to] (v1) -- (v2);
\draw[-to] (v1) -- (v3);
\draw[-to] (v1) -- (v4);
\draw[-to] (v2) -- (v8);
%\draw[edge] (v2)--(v6);
\draw[dashed, -to] (v2) -- (v6);
\draw[-to] (v3) -- (v8);
\draw[dashed, -to] (v4) -- (v6);
\draw[-to] (v4) -- (v5);
\draw[-to] (v8) -- (v7);
\draw[-to] (v3) -- (v5);
\draw[-to] (v5) -- (v7);
\draw[dashed, -to] (v6) -- (v7);
\draw[-to] (v2) -- (v9);
\draw[-to] (v3) -- (v9);
\draw[->] (v9) -- (v8);
\draw[dashed,->] (v2) -- (v10);
\draw[dashed,->] (v4) -- (v10);
\draw[dashed, ->] (v10) -- (v6);
\draw[->] (v3) -- (v11);
\draw[->] (v4) -- (v11);
\draw[->] (v11) -- (v5);
\end{tikzpicture}
}
\end{figure}
答案1
这是一种方法。如果无法编译代码,我假设您会面临 3 个问题:
- 节点的结构/位置
- 节点内容替换
- 调整
1. 节点的放置
有多种方法可以指定节点坐标,例如:
- 笛卡尔坐标
- 极坐标
- 矩阵(Tikz 中相当于表格)
- ETC。
我在这里采用矩阵路线。所以我需要做的就是将位置视为行和列。为了更好地跟踪,我在此草图中将节点坐标设为红色,将行和列设为蓝色:
因此Part 1
下面的代码就是这样做的:
- 放置此类节点
- 通过两种风格将它们联系起来
不要太担心比例和尺寸,因为这些仍然可以调整。请注意我为此目的为 D3 使用的 x-shift。不过,我会将其推迟到最后一步。
行\node {\strut}; & & & & & & \\
仅用作占位符以提供更多的垂直空间。
2. 内容替换(第二部分)
我只是展示了这个过程的开始,在数学模式中替换了一些内容。
为了更好地辅助放置对角节点的错觉,我使外部节点的线条更粗,请参阅样式声明。
如果您不喜欢节点 D2 和 D3 的分离,请将它们写在一行中(即删除多余的一行),然后根据需要应用一些 yshift。
3. 调整
因此,需要进行的主要调整是针对行和列的分隔,并且可能在需要时应用一些移位:
\matrix[column sep=6mm, row sep=6mm]
建议策略
standalone
使用类绘制这个立方体- 编译它并将其用于主文档中的包
\includegraphics
中的 pdfgraphicx
代码
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\usepackage{amsmath}
\begin{document}
% ~~~ developing the structure ~~~~~~~~~
\begin{tikzpicture}[
vs/.style={->, dashed},
>={Stealth},
]
% ~~~ Part 1: placement ~~~~~~~~~~~~~~~~~~~~~~~~
\matrix[column sep=20mm, row sep=12mm]
{
\node (100) {100}; & & & & \node (110) {110}; & & \\
& & & \node(D1) {D1}; & & \\
& & \node (101) {101}; & & & & \node (111) {111}; \\
& & \node[xshift=9mm] (D3) {D3}; & & &\\
& \node (D2) {D2}; \\
\node (000) {000};& & & & \node (010) {010}; & & \\
\node {\strut}; & & & & & & \\
& & \node (001) {001}; & & & & \node (011) {011}; \\
};
% ~~~ connections ~~~~~~~~~
% top
\draw[->] (100) -- (110);
\draw[->] (100) -- (101);
\draw[->] (101) -- (111);
\draw[->] (110) -- (111);
% down
\draw[->] (100) -- (000);
\draw[->] (101) -- (001);
\draw[->] (111) -- (011);
\draw[vs] (110) -- (010);
% side
\draw[->] (000) -- (001);
\draw[vs] (010) -- (011);
\draw[->] (101) -- (D2);
\draw[->] (000) -- (D2);
\draw[->] (D2) -- (001);
% bottom
\draw[vs] (000) -- (010);
\draw[->] (001) -- (011);
% diagonals
\draw[->] (101) -- (D1);
\draw[->] (110) -- (D1);
\draw[->] (D1) -- (111);
\draw[vs] (110) -- (D3);
\draw[vs] (000) -- (D3);
\draw[vs] (D3) -- (010);
\end{tikzpicture}
% ~~~ Part 2: replacements ~~~~~~~~~
\begin{tikzpicture}[
vs/.style={->, dashed},
vt/.style={->, line width=1.5pt},
>={Stealth},
]
% ~~~ placement ~~~~~~~~~~~~~~~~~~~~~~~~
\matrix[column sep=6mm, row sep=6mm]
{
\node (100) {$K(V,0)$}; & & & &
\node (110) {$\binom{V_1}{V}$}; & & \\
& & & \node(D1) {$\binom{V_1\oplus V_2}{V}$}; & & \\
& & \node (101) {$\binom{V_2}{V}$}; & & & & &
\node (111) {111}; \\
& & \node[xshift=9mm] (D3) {D3}; & & &\\
& \node (D2) {D2}; \\
\node (000) {000};& & & & \node (010) {010}; & & \\
\node {\strut}; & & & & & & \\
& & \node (001) {001}; & & & & & \node (011) {011}; \\
};
% ~~~ connections ~~~~~~~~~
% top
\draw[vt] (100) -- (110);
\draw[vt] (100) -- (101);
\draw[vt] (101) -- (111);
\draw[vt] (110) -- (111);
% down
\draw[->] (100) -- (000);
\draw[->] (101) -- (001);
\draw[->] (111) -- (011);
\draw[vs] (110) -- (010);
% side
\draw[->] (000) -- (001);
\draw[vs] (010) -- (011);
\draw[->] (101) -- (D2);
\draw[->] (000) -- (D2);
\draw[->] (D2) -- (001);
% bottom
\draw[vs] (000) -- (010);
\draw[->] (001) -- (011);
% diagonals
\draw[->] (101) -- (D1);
\draw[->] (110) -- (D1);
\draw[->] (D1) -- (111);
\draw[vs] (110) -- (D3);
\draw[vs] (000) -- (D3);
\draw[vs] (D3) -- (010);
\end{tikzpicture}
\end{document}
答案2
后续行动我的答案;不用于投票,而是为了使长答案更具可读性。
这是使用简单的方法实现的一种方法Tikz
。然而,我建议你重新考虑一下你的跨界想法,这只是一种视觉手段,需要付出相当大的努力,而且副作用很大。
基本思想
- 一旦其他一切都画好了
- 最后画出交叉路径
- 所以它们的白色大轮廓覆盖了其余部分
- 给人一种“穿越”的错觉
这会带来一些问题。我们来看看。
风格
新样式co
使用double
路径参数,参见 pgfmanual 的第 15 章。
% ~~~ Part 3: crossing over ~~~~~~~~~
\begin{tikzpicture}[
vs/.style={->, dashed},
vt/.style={->, line width=1.5pt},
>={Stealth},
% to cross over:
co/.style={
% double line parameters:
draw=white,double=black,line width=3pt,
double distance=1.5pt,
% arrow-tip parameters
-{Stealth[width=10mm,fill=black]}},
]
为了更好的可见性,我将右侧的一行改为蓝色。
正如那里描述的:
- 在这里用白色画一条粗线,包括箭头
- 画出“正常”线,这里用黑色
相互矛盾的要求需要权衡:
- 你想要一条粗白线来“覆盖/跨越”其他线
- 您需要一条细白线以避免其他遮挡物
参见 111 的粗前线:箭头尖端的粗白色轮廓遮住了其他线条,包括尖端。您可以co
在一定程度上平衡 -parameters...
绘制最后路径
这里你可以看到几种方法的结合:
- 首先是顶部的 111 行
- 第二,节点位置被透支
- 第三,侧面的蓝线采用不同的方法
% crossing over pathes
% front, top
\draw[vt,co] (101) -- (111);
% drawing over the placeholder
\node[fill=white] at (D1) {$\binom{V_1\oplus V_2}{V}$};
% alternative: draw thick white line AND normal vector
\draw[draw=white, line width=12pt] (D2) -- (001);
\draw[->,blue] (D2) -- (001);
我刚才描述了第一个。
第二个会“覆盖”顶部后面的箭头(D1)。两个步骤:
- 将一个足够大的空节点放入矩阵(接下来是代码)
- 将第二个节点放在末尾的位置(之前的代码)
% & & & \node(D1) {$\binom{V_1\oplus V_2}{V}$}; & & \\
% new: placeholder
& & & \node[minimum size=10mm] (D1) {}; & & \\
第三个只是绘制了两次连接:
- 曾经是一条没有箭头的大白线
- 并作为普通向量
- 请认出 001 附近的文物
代码
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\usepackage{amsmath}
\begin{document}
% ~~~ developing the structure ~~~~~~~~~
% ~~~ Part 3: crossing over ~~~~~~~~~
\begin{tikzpicture}[
vs/.style={->, dashed},
vt/.style={->, line width=1.5pt},
>={Stealth},
% to cross over:
co/.style={
% double line parameters:
draw=white,double=black,line width=3pt,
double distance=1.5pt,
% arrow-tip parameters
-{Stealth[width=10mm,fill=black]}},
]
% ~~~ placement ~~~~~~~~~~~~~~~~~~~~~~~~
\matrix[column sep=6mm, row sep=6mm]
{
\node (100) {$K(V,0)$}; & & & &
\node (110) {$\binom{V_1}{V}$}; & & \\
% & & & \node(D1) {$\binom{V_1\oplus V_2}{V}$}; & & \\
% new: placeholder
& & & \node[minimum size=10mm] (D1) {}; & & \\
& & \node (101) {$\binom{V_2}{V}$}; & & & & &
\node (111) {111}; \\
& & \node[xshift=9mm] (D3) {D3}; & & &\\
& \node (D2) {D2}; \\
\node (000) {000};& & & & \node (010) {010}; & & \\
\node {\strut}; & & & & & & \\
& & \node (001) {001}; & & & & & \node (011) {011}; \\
};
% ~~~ connections ~~~~~~~~~
% top
\draw[vt] (100) -- (110);
\draw[vt] (100) -- (101);
\draw[vt] (110) -- (111);
% down
\draw[->] (100) -- (000);
\draw[->] (101) -- (001);
\draw[->] (111) -- (011);
% highlighting this one: remove the dashed parameter
\draw[->,blue] (110) -- (010);% <<< new
% side
\draw[->] (000) -- (001);
\draw[vs] (010) -- (011);
\draw[->] (101) -- (D2);
\draw[->] (000) -- (D2);
% \draw[->] (D2) -- (001);
% bottom
\draw[vs] (000) -- (010);
\draw[->] (001) -- (011);
% diagonals
\draw[->] (101) -- (D1);
\draw[->] (110) -- (D1);
\draw[->] (D1) -- (111);
\draw[vs] (110) -- (D3);
\draw[vs] (000) -- (D3);
\draw[vs] (D3) -- (010);
% crossing over pathes
% front, top
\draw[vt,co] (101) -- (111);
% drawing over the placeholder
\node[fill=white] at (D1) {$\binom{V_1\oplus V_2}{V}$};
% alternative: draw thick white line AND normal vector
\draw[draw=white, line width=12pt] (D2) -- (001);
\draw[->,blue] (D2) -- (001);
\end{tikzpicture}
\end{document}
答案3
作为后续行动你的评论,这很不具体,而且这个答案是一个单独的问题。
背景
有多种使用方法Tikz drawings
,例如:
- 直接将代码写入文档(就像你似乎做的那样)
- 移动
Tikz-code
到外部文件,\input
它(基本上是相同的) - 使用包
subfiles
,允许单独编译每个子文件和主文档 - 我的建议:使用包
graphicx
- 当然还有更多的方法来实现它
使用主文档中的 Tikz 代码时,您可能错过了transform shape
一些选项;请参阅 pgfmanual。
例子
- 首先使用类在单独的文件中创建并编译你的 Tikz 绘图
standalone
- 第二,将 pdf 作为图形包含进去
要做到这一点:
- 让
standalone
绘画看起来正确 - 即根据需要调整
column sep
和row sep
节点shifts
- 首先调整以获得平衡的外观
当通过它包含 pdf 时,graphicx
它仍然是矢量图形,即您没有像素伪影,除非您的 pdf 查看器引入它们。
结果和代码
假设cubeCross.pdf
为独立文件,位于同一目录中,来自类standalone
来自我之前的回答:
\documentclass[10pt,a4paper]{article}
\usepackage{graphicx}
\usepackage{lipsum}
\begin{document}
\lipsum[10]
For including the Tikz-drawing see figure \ref{img}.
\begin{figure}[!h]
\includegraphics[width=\textwidth]{cubeCross}
\caption{Including cubeCross.pdf}\label{img}
\end{figure}
\lipsum[11]
\end{document}