pb 图中平行箭头

pb 图中平行箭头

是否可以使用 在两个节点之间获得两个平行映射(一个指向左侧,另一个指向右侧)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 提供的标准算术运算符;其他一些包可能会让您访问平方根运算符,因此可以更好地调整倾斜箭头的间距。

相关内容