我只是想让交换正方形中所有应该平行的箭头实际上平行。这是我的图表:
外层方块显示来自所显示域和余域的函数。内层方块(问题方块)精确显示这些函数对元素的作用。我希望所有相应的线都是平行的。此外,右下角的内部节点侵入了外部节点。我该如何将其移开并获得正确的方块?
这是我的代码:
\documentclass[12pt]{article}
\usepackage{pictexwd,dcpic}
\usepackage{amsmath,amsfonts,amsthm,dsfont,bbm}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows,decorations.pathmorphing}
\usepackage{tikz-cd}
\usepackage{verbatim}
\begin{document}
\begin{tikzpicture}[baseline=(current bounding box.center), scale = 1.5]
\node (homa) at (2, 2) {$\text{hom}_{D}(a, a)$};
\node (homb) at (2,0) {$\text{hom}_{D}(a, b)$};
\node (Ta) at (6, 2) {$Ta$};
\node (Tb) at (6,0) {$Tb$};
\node (id) at (homa.south east) {$1_a$};
\node (f) at (homb.north east) {$f$};
\node (x) at (Ta.south west) {$x$};
\node (Tfx) at (Tb.north west) {$Tf(x)$};
\path[->]
(homa) edge node[left]{$\text{hom}_{D}(a, f)$} (homb)
(Ta) edge node[right] {$Tf$} (Tb)
(homa) edge node[above] {$\tau_a$} (Ta)
(homb) edge node[below] {$\tau_{b}$} (Tb);
\path[>=stealth,|->]
(id) edge (f)
(id) edge (x)
(f) edge (Tfx)
(x) edge (Tfx);
\end{tikzpicture}
\end{document}
我已使用(node.south west)
处方将节点定位在内正方形中。我确实希望内正方形的节点恰好位于外正方形节点的角上,因为内正方形的节点是外正方形节点所表示的各个集合的成员。
答案1
以 为例tikz-cd
。
输出
代码
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\[\begin{tikzcd}[row sep={6mm,between origins},column sep={1cm,between origins}]
hom_{D}(a,a) \arrow[rrrr, "\tau_{a}"] \arrow[ddd, "{hom_{D}(a,f)}", swap]
& & & & Ta \arrow[ddd, "Tf"] \\
& 1_{a} \arrow[rr, |->] \arrow[d, |->] & & x \arrow[d, |->] & \\[1cm]
& f \arrow[rr, |->] & & Tf(x) \\
hom_{D}(a,b) \arrow[rrrr, "\tau_{b}", swap] & & & & Tb\\
\end{tikzcd}\]
\end{document}
答案2
对于交换图我总是使用tikz 的 \matrix
命令与 一起matrix of math nodes
使用。这提供了一种简单的方法,可以将图表的节点放入数组中,然后在节点之间绘制线条。要使用此功能,您需要有
\usetikzlibrary{matrix}
在你的序言中。基本思想是这样的:
\begin{tikzpicture}[auto]
\matrix (M)[matrix of math nodes,row sep=1cm,column sep=16mm]{
A&B\\
C&D\\
};
\draw[->](M-1-1)--(M-1-2)--(M-2-2)--(M-2-1)--(M-1-1);
\end{tikzpicture}
生成结果:
因此,您可以将节点称为(M-<row>-<col>)
。是的M
第一个参数。您可以随意将其设置为任意值。(M)
\matrix
通常,行和列的间距由 控制row sep=1cm,column sep=16mm
,对于所有行和列都是恒定的(再次选择合适的值)。对于 OP 图,我们需要稍微改变间距,您可以使用矩阵内的可选参数来实现,如下所示。指定您想要的行和列距离也是很好的,between origins
因为这会带来更好的间距。最终结果是:
以下是代码:
\documentclass{article}
\usepackage{mwe}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows}
\usepackage{amsmath}
\begin{document}
\begin{center}
\begin{tikzpicture}[>=stealth,->,shorten >=2pt,looseness=.5,auto]
\matrix (M)[matrix of math nodes,row sep={6mm,between origins},
column sep={6mm,between origins}]{
\hom_{D}(a, a)& &[28mm] & Ta\\% 28mm=extra space between cols 2&3
& 1_a & x & \\[16mm]% extra space between rows 2&3
& f & Tf & \\
\hom_{D}(a, a)& & & Tb\\
};
\draw[->](M-1-1)--node{$\tau_a$}(M-1-4);
\draw[->](M-4-1)--node[below]{$\tau_b$}(M-4-4);
\draw[->](M-1-1)--node[left]{$\hom_D(a,f)$}(M-4-1);
\draw[->](M-1-4)--node{$Tf$}(M-4-4);
% inner square
\draw[|->](M-2-2)--(M-2-3);
\draw[|->](M-3-2)--(M-3-3);
\draw[|->](M-2-2)--(M-3-2);
\draw[|->](M-2-3)--(M-3-3);
\end{tikzpicture}
\end{center}
\end{document}
请注意,我使用\hom
而不是\text{hom}
来表示 hom-spaces。我还使用了“隐形”箭头,因为我更喜欢它们。