我已经使用 tikz 创建了一个交换图,我觉得我已经快完成了。以下是我目前所做的:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{amsmath,amsfonts}
\usetikzlibrary{matrix,arrows}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, row sep=1.5em, column sep=2.5em, text height=1.5ex, text depth=0.25ex]
{ \mathbb{C}[x_1,...,x_s]/J(f) & \mathbb{C}[x_1,...,x_s]/J(g)\\
\mathbb{C}[x]/\langle J(f),x_{s+1},...,x_n\rangle & \mathbb{C}[x]/\langle J(g),x_{s+1},...,x_n\rangle\\ };
\path[->]
(m-1-1) edge node[above] {$\sim$} (m-1-2)
(m-2-1) edge[dashed] node[above] {$\sim$} (m-2-2);
\draw[transparent]
(m-1-1) edge node[rotate=270,opacity=1] {$\cong$} (m-2-1)
(m-1-2) edge node[rotate=270,opacity=1] {$\cong$} (m-2-2);
\end{tikzpicture}
\end{document}
到目前为止,我很喜欢它,但是有没有办法调整箭头 (1,1) -> (1,2) 和 (2,1) -> (2,2) 的长度?理想情况下,它们应该具有相同的长度,即下箭头的长度。
答案1
一个简单的解决方案就是用库来减少width
第一个箭头calc
。
例子:
\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{amsmath,amssymb}
\usetikzlibrary{matrix,arrows,calc}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes, row sep=1.5em, column sep=2.5em, text height=1.5ex, text depth=0.25ex]
{ \mathbb{C}[x_1,...,x_s]/J(f) & \mathbb{C}[x_1,...,x_s]/J(g)\\
\mathbb{C}[x]/\langle J(f),x_{s+1},...,x_n\rangle & \mathbb{C}[x]/\langle J(g),x_{s+1},...,x_n\rangle\\ };
\path[->]
($(m-1-1.east)+(0.5,0)$) edge node[above] {$\sim$} ($(m-1-2.west)-(0.5,0)$)
(m-2-1) edge[dashed] node[above] {$\sim$} (m-2-2);
\draw[transparent]
(m-1-1) edge node[rotate=270,opacity=1] {$\cong$} (m-2-1)
(m-1-2) edge node[rotate=270,opacity=1] {$\cong$} (m-2-2);
\end{tikzpicture}
\end{document}
图解:
如果这是唯一需要调整的图片,这可能是一种方法,否则可以更自动化地完成该过程:1)基于@percusse 评论,2)使用TikZ:如何确定两个坐标之间的向量确定最短箭的长度,并根据该长度调整其他箭的长度。
由 percusse 编辑
可以取不同节点的正交交点,通过(m-1-1 -| m-2-1.east) edge node[above] {$\sim$} (m-1-2 -| m-2-2.west)
该交点可以分别得到行的垂直分量以及第二行条目的终点和起点的水平分量。
为了进一步实现自动化,可以修复节点文本宽度,以便每个单元格都继承相同的文本宽度并居中。可以通过nodes={.....}
提供给矩阵的键将选项传递给各个单元格
\documentclass{standalone}
\usepackage{tikz}
\usepackage{amsmath,amsfonts}
\usetikzlibrary{matrix,arrows}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes,
row sep=1.5em,
column sep=2.5em,
nodes={
text width=4cm,
align=center
}
]
{ \mathbb{C}[x_1,...,x_s]/J(f) & \mathbb{C}[x_1,...,x_s]/J(g)\\
\mathbb{C}[x]/\langle J(f),x_{s+1},...,x_n\rangle & \mathbb{C}[x]/\langle J(g),x_{s+1},...,x_n\rangle\\ };
\path[->]
(m-1-1) edge node[above] {$\sim$} (m-1-2)
(m-2-1) edge[dashed] node[above] {$\sim$} (m-2-2);
\draw[transparent]
(m-1-1) edge node[rotate=270,opacity=1] {$\cong$} (m-2-1)
(m-1-2) edge node[rotate=270,opacity=1] {$\cong$} (m-2-2);
\end{tikzpicture}
\end{document}
答案2
正如我在评论中提到的那样,避免使用的一个快速而肮脏的解决方法calc
可能是:
(m-1-1) edge[shorten <= .5cm, shorten >= .5cm] node[above] {$\sim$} (m-1-2)
最大的缺点是您需要手动设置缩短的量,这不一定非常准确。