tikz-cd:将堆叠的箭头移向目标方向

tikz-cd:将堆叠的箭头移向目标方向

我正在使用(稍微更新的)版本这是我对自己问题的回答绘制单纯形图的堆叠箭头:

\documentclass{article}

\usepackage{amsmath,tikz-cd}

\tikzcdset{
  diagrams={>={Straight Barb[scale=0.5]}}
}

\ExplSyntaxOn

\NewDocumentCommand\stackar{ m O{} }
{
    \int_step_inline:nn { #1 }
    {
        \ar[->,shift~left=\fp_eval:n {(#1-1)/2*3 - (##1-1)*3 }pt,#2]
    }
}

\NewDocumentCommand\altstackar{ m O{} }
{
    \int_step_inline:nn { #1 }
    {
        \int_if_odd:nTF { ##1 }
        {
            \ar[->,shift~left=\fp_eval:n {(#1-1)/2*1.5 - (##1-1)*1.5 }pt,#2]
        }
        {
            \ar[<-,shift~left=\fp_eval:n {(#1-1)/2*1.5 - (##1-1)*1.5 }pt,#2]
        }
    }
}

\ExplSyntaxOff

\begin{document}

\[\begin{tikzcd}
    \dotsb
    \stackar{4}[r]
        & X_2 \stackar{3}[r]
            & X_1 \stackar{2}[r]
                & X_0
\end{tikzcd}\]

\[\begin{tikzcd}
    \dotsb
    \altstackar{7}[r]
        & X_2 \altstackar{5}[r]
            & X_1 \altstackar{3}[r]
                & X_0
\end{tikzcd}\]

\[\begin{tikzcd}
    X_2 \altstackar{5}[d]
\\
    X_1
\end{tikzcd}\]

\end{document}

在此处输入图片描述

但是,结果对我来说还是有点太杂乱了。箭头完全被相邻箭头的箭头主体包围,这看起来很奇怪。所以我更喜欢下面这样。但是,正如您所见,使用xshift有时会失败,例如当箭头垂直时。有没有办法将箭头“向前”移动,即朝向目标?

\documentclass{article}

\usepackage{amsmath,tikz-cd}

\tikzcdset{
  diagrams={>={Straight Barb[scale=0.5]}}
}

\ExplSyntaxOn

\NewDocumentCommand\stackar{ m O{} }
{
    \int_step_inline:nn { #1 }
    {
        \ar[->,shift~left=\fp_eval:n {(#1-1)/2*3 - (##1-1)*3 }pt,#2]
    }
}

\NewDocumentCommand\altstackar{ m O{} }
{
    \int_step_inline:nn { #1 }
    {
        \int_if_odd:nTF { ##1 }
        {
            \ar[->,shift~left=\fp_eval:n {(#1-1)/2*1.5 - (##1-1)*1.5 }pt,xshift=.5pt,#2]
        }
        {
            \ar[<-,shift~left=\fp_eval:n {(#1-1)/2*1.5 - (##1-1)*1.5 }pt,xshift=-.5pt,#2]
        }
    }
}

\ExplSyntaxOff

\begin{document}

\[\begin{tikzcd}
    \dotsb
    \stackar{4}[r]
        & X_2 \stackar{3}[r]
            & X_1 \stackar{2}[r]
                & X_0
\end{tikzcd}\]

\[\begin{tikzcd}
    \dotsb
    \altstackar{7}[r]
        & X_2 \altstackar{5}[r]
            & X_1 \altstackar{3}[r]
                & X_0
\end{tikzcd}\]

\[\begin{tikzcd}
    X_2 \altstackar{5}[d]
\\
    X_1
\end{tikzcd}\]

\end{document}

在此处输入图片描述

答案1

我提出了一个替代解决方案,即定义可在 中的任何地方使用的新箭头样式tikzcd。这些样式称为stackaraltstackar,它们接受箭头数量的参数。不是移动箭头进行交替,而是将尾部缩短2pt。您可以在定义末尾附近更改它altstackar

这个想法是计算一个(\xperp,\yperp)垂直于箭头方向的长度向量3pt(或1.5pt交替箭头),然后将箭头移动该向量的倍数。

用法:\arrow[r, stackar=<number>]\arrow[r, altstackar=<number>]。箭头方向可以是典型的 中接受的任何内容tikzcd

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath, tikz-cd}
\usetikzlibrary{decorations.pathreplacing, calc}

\tikzcdset{
  diagrams={>={Straight Barb[scale=0.5]}}
}
\tikzset{
  stackar/.style={decorate, decoration={show path construction,
    lineto code={
      \path (\tikzinputsegmentfirst); \pgfgetlastxy{\xstart}{\ystart}
      \path (\tikzinputsegmentlast); \pgfgetlastxy{\xend}{\yend}
      \path ($(0,0)!3pt!(\ystart-\yend,\xend-\xstart)$); \pgfgetlastxy{\xperp}{\yperp}
      \foreach \n[evaluate=\n as \k using .5*#1-\n+.5] in {1,...,#1}{
        \draw[->, shift={($\k*(\xperp,\yperp)$)}](\xstart,\ystart)--(\xend,\yend);
      }
    }
  }}, stackar/.default={1},
  altstackar/.style={decorate, decoration={show path construction,
    lineto code={
      \path (\tikzinputsegmentfirst); \pgfgetlastxy{\xstart}{\ystart}
      \path (\tikzinputsegmentlast); \pgfgetlastxy{\xend}{\yend}
      \path ($(0,0)!1.5pt!(\ystart-\yend,\xend-\xstart)$); \pgfgetlastxy{\xperp}{\yperp}
      \foreach \n[evaluate=\n as \k using .5*#1-\n+.5] in {1,...,#1}{
        \ifodd\n{\draw[->, shorten <=2pt, shift={($\k*(\xperp,\yperp)$)}](\xstart,\ystart)--(\xend,\yend);}
        \else{\draw[<-, shorten >=2pt, shift={($\k*(\xperp,\yperp)$)}](\xstart,\ystart)--(\xend,\yend);}\fi
      }
    }
  }}, altstackar/.default={1}
}


\begin{document}

\[\begin{tikzcd}
    \dotsb\arrow[r, stackar=4] & X_2\arrow[r, stackar=3] & X_1\arrow[r, stackar=2] & X_0
\end{tikzcd}\]

\[\begin{tikzcd}
    \dotsb\arrow[r, altstackar=7] & X_2\arrow[r, altstackar=5] & X_1\arrow[r, altstackar=3] & X_0
\end{tikzcd}\]

\[\begin{tikzcd}
    X_2 \arrow[d, altstackar=5] &\\
    X_1 & X_3\arrow[ul, altstackar=3]
\end{tikzcd}\]

\end{document}

相关内容