在 tikzcd 中设置箭头的绝对长度

在 tikzcd 中设置箭头的绝对长度

如果您想更改 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}

输出

在此处输入图片描述

相关内容