是否可以使用 在两个节点之间获得两个平行映射(一个指向左侧,另一个指向右侧)pb-diagram
?我知道可以使用 TikZ 完成,也许可以使用其他一些包,但我使用pb-diagram
。请注意,选项=
是不够的。我还想要箭头的头部(=
选项只画两条平行线)...
答案1
样式文件pb-diagram.sty
包含几个自定义箭头的示例。基本上,您必须使用 LaTeX 的内置picture
环境构建适当的表示。以下是对此的尝试。两个箭头的分离由 控制\twoarrowsep
。如果您不需要对角箭头,较小的值可能看起来更好。
\documentclass{article}
\usepackage{pb-diagram}
\newcount\twoarrowsep
\twoarrowsep=50
\makeatletter
\@namedef{dgo@dd}{\let\dg@VECTOR=\dg@twoarrowedvector}%
\newcount\dg@XSHIFT
\newcount\dg@YSHIFT
\def\dg@twoarrowedvector(#1,#2)#3{%
\begingroup
\dg@XTEMP=#1\relax\multiply\dg@XTEMP\m@ne\relax
\dg@YTEMP=#2\relax\multiply\dg@YTEMP\m@ne\relax
\dg@ZTEMP=#1\relax
\ifnum\dg@ZTEMP<\z@
\multiply\dg@ZTEMP\m@ne\relax \fi
\ifnum\dg@YTEMP<\z@
\advance\dg@ZTEMP by -\dg@YTEMP
\else \advance\dg@ZTEMP by \dg@YTEMP \fi
\dg@XSHIFT=#2\relax\multiply\dg@XSHIFT\m@ne\relax\multiply\dg@XSHIFT\twoarrowsep\relax
\divide\dg@XSHIFT by \dg@ZTEMP\relax
\dg@YSHIFT=#1\relax\multiply\dg@YSHIFT\twoarrowsep\relax\divide\dg@YSHIFT by \dg@ZTEMP\relax
\begin{picture}(0,0)%
\thinlines
\put(-\dg@XSHIFT,-\dg@YSHIFT){\vector(#1,#2){#3}}%
\put(\dg@XSHIFT,\dg@YSHIFT){\line(#1,#2){#3}}%
\put(\dg@XSHIFT,\dg@YSHIFT){\vector(\dg@XTEMP,\dg@YTEMP){0}}
\end{picture}%
\endgroup}%
\makeatother
\begin{document}
\begin{displaymath}
\begin{diagram}
\node{A}
\arrow{e,dd}
\arrow{se,dd}
\arrow{s,dd}
\node{B}\\
\node{C} \node{D} \arrow{w,dd} \arrow{n,dd}
\end{diagram}
\end{displaymath}
\end{document}
代码绘制了两个箭头,它们以相同的量沿垂直方向偏离标准轴。相反的箭头实际上分为两个部分绘制,即茎部和头部,以避免一些额外的计算。因此,环境picture
由三个\put
命令组成。
正如在包本身中一样,我保留了 LaTeX 提供的标准算术运算符;其他一些包可能会让您访问平方根运算符,因此可以更好地调整倾斜箭头的间距。