在 tikz 中将一个箭头的长度调整为另一个箭头的长度

在 tikz 中将一个箭头的长度调整为另一个箭头的长度

我已经使用 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)

最大的缺点是您需要手动设置缩短的量,这不一定非常准确。

相关内容