我正在使用(稍微更新的)版本这是我对自己问题的回答绘制单纯形图的堆叠箭头:
\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
。这些样式称为stackar
和altstackar
,它们接受箭头数量的参数。不是移动箭头进行交替,而是将尾部缩短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}