如果您想更改 tikzcd 图中箭头的长度,有很多选择:
- 将“缩短 => 10pt”或“缩短 >= 15pt”附加到箭头描述中。
- 在 tikzcd 的开始处使用 [{column sep = 15pt, row sep = 20pt}] 更改行/列分隔。
- 在相应的 & 或 // 前使用 [-15pt] 或 [5pt] 更改单独的列/行分隔。
我没问这些。
如果我想要绝对长度我的所有(或一个)箭头都是 20pt,我该怎么做?
也就是说,我的所有箭头(或某个箭头)的长度都是 20pt。请注意,以上选项均无法实现这一点。
答案1
这是一种可能性。定义一种名为 的新箭头类型myarrow
,它是用特殊箭头装饰的白色箭头。箭头是Butt Cap
给定长度的 ,后面跟着标准箭头(移动以保持居中)。长度由 全局控制\myarrowlength
。然后,您可以myarrow
像第一个示例中使用 一样对单个箭头使用\arrow[r, myarrow]
,或者像第二个示例中使用 一样对所有箭头使用\begin{tikzcd}[arrows=myarrow]
\documentclass{article}
\usepackage{tikz-cd}
\usetikzlibrary{decorations.markings}
\newcommand{\myarrowlength}{10pt}
\tikzset{mytip/.tip={Butt Cap[black, length=\myarrowlength, sep=-1.6pt]>[black]},
myarrow/.style={white, decoration={transform={xshift=.5*\myarrowlength}, markings, mark=at position .5 with {\arrow{mytip}}}, postaction=decorate}}
\begin{document}
\begin{tikzcd}
A\arrow[dr]\\
B\arrow[u]\arrow[r, myarrow] & C
\end{tikzcd}
\qquad
\begin{tikzcd}[arrows=myarrow]
A\arrow[dr]\\
B\arrow[u]\arrow[r] & C
\end{tikzcd}
\end{document}
更新:
要为箭头添加标签,白色箭头必须带有标签。现在,该标签已包含在定义中,同时还包含默认的空标签。例如,myarrow="h"'
将标签放置h
在“右侧”。用于{}
更复杂的标签,例如myarrow={"h"', text=red}
。
\documentclass{article}
\usepackage{tikz-cd}
\usetikzlibrary{decorations.markings}
\newcommand{\myarrowlength}{10pt}
\tikzset{mytip/.tip={Butt Cap[black, length=\myarrowlength, sep=-1.6pt]>[black]},
myarrow/.style={white, text=black, #1, decoration={transform={xshift=.5*\myarrowlength}, markings, mark=at position .5 with {\arrow{mytip}}}, postaction=decorate},
myarrow/.default={}}
\begin{document}
\begin{tikzcd}
A\arrow[dr]\\
B\arrow[u]\arrow[r, myarrow="h"'] & C
\end{tikzcd}
\qquad
\begin{tikzcd}[arrows=myarrow]
A\arrow[dr]\\
B\arrow[u]\arrow[r] & C
\end{tikzcd}
\end{document}
答案2
对于直线路径,可以简单地绘制新的较短线路calc
。
将/tikz/commutative diagrams/@shiftabletopath
键设置\tikztostart
为\tikztotarget
节点边界上的实际点,以便短路径实际上位于节点边界的中间,而不是它们的中心。
当节点之间的距离小于指定长度时,这将导致绘制不理想(箭头将穿过节点),并且对于非直箭头绝对会失败。我想,最好的解决方案就是装饰。但话又说回来,当节点相距 100pt 时,我认为 20pt 弯曲箭头不会有太大帮助。
代码
\documentclass{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{calc}
\tikzcdset{
fixed length/.default=10pt,
fixed length/.style={
/tikz/commutative diagrams/@shiftabletopath,
to path={
($(\tikztostart)!.5!(\tikztotarget)!#1/2!(\tikztostart)$)
-- ($(\tikztostart)!.5!(\tikztotarget)!#1/2!(\tikztotarget)$)
\tikztonodes}}}
\begin{document}
\begin{tikzcd}
X \arrow[r, hook]
\arrow[dr, dashrightarrow, fixed length]
& \bar{X} \arrow[d]\\
& Y
\end{tikzcd}
\begin{tikzcd}[arrows=fixed length]
X \arrow[r, hook]
\arrow[dr, dashrightarrow]
& \bar{X} \arrow[d]\\
& Y
\end{tikzcd}
\end{document}