我想用 TikZ 在交换图中绘制带标签的平行箭头,我在谷歌和 Tex Stackexchange 上搜索过,然而,我只找到了绘制平行箭头的方法transform canvas
,我试图添加标签但失败了。
这是我的照片:
我想要标记一张从$\mathfrak{P}=\bigoplus_{i\inI}\mathfrak{P_{i}}$
到$\mathfrak{P_{i}}$ and from $\mathfrak{P_{i}}$
到 的地图$\mathfrak{P}=\bigoplus_{i\inI}\mathfrak{P_{i}}$
,即正方形的箭头。
以下是代码:
\begin{tikzpicture}[node distance=2.8cm, auto]
\node (P) {$\mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}$};
\node(Q)[right of=P] {$\mathfrak{P_{j}}$};
\node (B) [below of=P] {$\mathfrak{B}$};
\node (C) [right of=B] {$\mathfrak{C}$};
\draw[transform canvas={yshift=0.5ex},->] (P) - -(Q);
\draw[transform canvas={yshift=-0.5ex},->](Q) -- (P);
\draw[->](Q) to node {$a$}(B);
\draw[->](Q) to node {$a$}(C);
\draw[->] (P) to node {$\pi_{j}$} (B);
\draw[->] (B) to node {$\psi$} (C);
\draw[->, dashed] (Q) to node [swap] {$g$} (B);
\end{tikzpicture}
答案1
这是您标记的线条。
还有其他方法可以转移节点,但在我看来这transform canvas
是最直接的,所以你在这方面做得很好。
要标记一条线,您可以在线规范的末尾添加一个节点命令。标签可以放置在above
或,您可以使用关键字(例如或更通用的)below
指定沿线的位置。我还移动了对角线,以便它们都可以被看到(因为其中一条是虚线)。midway
pos=<fraction along line>
我添加了一个宏来简化对角线的移动。
\documentclass[border=5pt]{standalone}
\usepackage{amsmath,amssymb}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[node distance=2.8cm, auto]
\pgfmathsetmacro{\shift}{0.3ex}
\node (P) {$\mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}$};
\node(Q)[right of=P] {$\mathfrak{P_{j}}$};
\node (B) [below of=P] {$\mathfrak{B}$};
\node (C) [right of=B] {$\mathfrak{C}$};
\draw[transform canvas={yshift=0.5ex},->] (P) --(Q) node[above,midway] {\tiny top};
\draw[transform canvas={yshift=-0.5ex},->](Q) -- (P) node[below,midway] {\tiny bottom};
\draw[->](Q) to node {$a$}(C);
\draw[->] (P) to node[swap] {$\pi_{j}$} (B);
\draw[->,dashed] (B) to node {$\psi$} (C);
\draw[->,transform canvas={xshift=-\shift,yshift=\shift}](Q) to node {$a$}(B);
\draw[->, dashed,transform canvas={xshift=\shift,yshift=-\shift}] (Q) to node[swap] {$g$} (B);
\end{tikzpicture}
\end{document}
答案2
也许是为了澄清一些观点。
1) 第一种([yshift=...]P)--([yshift=...]Q)
不起作用。示例:
\documentclass{scrartcl}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node(A) at (0,0) {A}; \node(B) at (5,0) {B};
\draw[green] (A) -- (B);
\draw [yellow,yshift=.5 cm] (0,0) -- (5,0);
\draw[blue,yshift=1 cm] (A) -- (B); %problem
\draw[red] ([yshift=1 cm]A) -- ([yshift=1 cm]B); %problem
\draw[magenta] ([yshift=1 cm]A.east) -- ([yshift=1 cm]B.west);
\end{tikzpicture}
\begin{tikzpicture}
\coordinate(A) at (0,0) ; \coordinate(B) at (5,0);
\draw (A) -- (B);
\draw[red] ([yshift=.5 cm]A) -- ([yshift=.5 cm]B); %fine
\draw[blue,yshift=1 cm] (A) -- (B); %problem
\end{tikzpicture}
\end{document}
2)关于transform canvas
应谨慎使用画布变换。在大多数情况下,您不希望图片中的线宽发生变化,因为这会造成视觉不一致。同样重要的是,当您使用画布变换时,pgf 会丢失节点位置和图片大小的轨迹,因为它在计算节点坐标时不考虑画布变换的影响(但不要依赖这一点;它可能会在未来发生变化)。最后,请注意,画布变换始终适用于整个路径,不可能(对于坐标变换)在路径的不同部分使用不同的变换。简而言之,除非您真正知道自己在做什么,否则不应使用画布变换。
我认为最好避免
3)我删除了right of
等,因为我喜欢在必要时缩放图片
right of
似乎更简洁,但你需要修复node distance=...
并写得
right of=P
at (5,0)
更简洁或`-++(5,0)``
\documentclass{scrartcl}
\usepackage{amsmath,amssymb}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[auto,scale=2]
\node (P) at (0,0) {$\mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}$};
\node (Q) at (3,0) {$\mathfrak{P_{j}}$};
\node (B) at (0,-3) {$\mathfrak{B}$};
\node (C) at (3,-3) {$\mathfrak{C}$};
\draw[->] ([yshift = .3ex]P.east) -- node[above] {\tiny top}
([yshift = .3ex]Q.west) ;
\draw[<-] ([yshift = -.3ex]P.east) -- node[below] {\tiny bottom}
([yshift = -.3ex]Q.west);
\draw[->](Q) to node {$a$}(C);
\draw[->] (P) to node[swap] {$\pi_{j}$} (B);
\draw[->,dashed] (B) to node {$\psi$} (C);
\draw[->] ( Q.south west) -- node[above] {$a$}
( B.north east) ;
\draw[->,dashed] ([xshift= 0.2ex ,yshift = - 0.3ex ] Q.south west) -- node[below] {$g$}
([xshift= 0.2ex ,yshift = - 0.3ex ]B.north east);
\end{tikzpicture}
\end{document}
答案3
你可能还想看看这个相当新的包tikz-cd
。
其命令\arrow
有一个强制参数,用于标识方向,例如r
“右”。它还有一个可选参数来指定 TikZ 选项,例如transform canvas
。它还有用于标签的进一步参数对(可选和“强制”)。
- 指向右边的箭头:
\arrow{r}
- 上面带有标签的向右箭头:
\arrow{r}{label}
- 指向右侧的箭头,下方带有标签:
\arrow{r}[swap]{label}
- 指向右侧并移动的箭头:
\arrow[transform canvas={yshift=.5ex}]{r}
以下是一次完整的尝试:
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[row sep=3cm,column sep=2.5cm]
\mathfrak{P}=\bigoplus_{i\in I}\mathfrak{P_{i}}
\arrow[transform canvas={yshift=.5ex}]{r}
\arrow[transform canvas={yshift=-.5ex},leftarrow]{r}
\arrow{d}[swap]{\pi_{j}}
& \mathfrak{P_{j}}
\arrow{d}{a}
\arrow[transform canvas={yshift=.3ex,xshift=-.3ex}]{ld}[swap]{g}
\arrow[transform canvas={yshift=-0.3ex,xshift=.3ex},dashed]{ld}{a} \\
\mathfrak{B}
\arrow{r}{\psi}
& \mathfrak{C}
\end{tikzcd}
\end{document}