我有一个使用包定义的图表环境编写的交换图pb-diagram
。我对图表的外观非常满意。
但是我需要将一些箭头改为虚线箭头。
手册中pb-diagram
指出箭杆的选项有:
.. | dotted or dashed arrow shaft
= | double line shaft* (“equals sign”)
! | invisible arrow shaft
例如,该命令\arrow{e,..}
应该绘制点状或虚线的箭头轴。
我的问题是?如何确保箭头是虚线而不是点线?在我尝试的所有示例中,箭头都变成了点线。
我将非常感激任何关于如何解决此问题的建议pb-diagrams
。下面是一个最小示例。
\documentclass[12pt]{article}
\usepackage{pb-diagram}
\begin{document}
\begin{equation}
\begin{diagram}
\node{A}
\arrow{e,t,..}{a}
\arrow{s,l,..}{c}
\arrow{ese,b,1,..}{u}
\node{B}
\arrow{e,t,..}{b}
\node{C}
\arrow{s,r}{d}
\arrow{wsw,b,1}{v} \\
\node{D}
\arrow[2]{e,b}{e}
\node[2]{H}
\end{diagram}
\end{equation}
\end{document}
所有虚线箭头均应为虚线箭头。
OBS:我知道有一个更高级的软件包叫 Ti钾Z,它更具表现力,显然允许人们很好地控制图表。但在这个问题中,我只对如何解决与包有关的问题感兴趣pb-diagram
,因为图表相当大,已经编码,我只需要添加一些虚线箭头来完成它。此外,我在安装 Ti 时遇到了一些麻烦钾我的电脑上有一个 Z。
答案1
pb-diagram
在这里我找到了放置点的例程,命名\dg@dotvector
并对其进行了一些修改。我用 替换了\circle
放置每个点的宏\rule
。但是,我需要以\rule
适当的角度倾斜,所以我使用\FPdiv
和\FParctan
来\FPmul
计算角度正切,取反正切,并转换为度数。然后我使用 将\rotatebox
上述角度调整\rule
为该角度。
编辑以利用 LaRiFaRi 的出色建议,从而允许同时使用点..
和划--
语法。在下面的 MWE 中,我在图中显示了点和划线(以及实线)。
\documentclass[12pt]{article}
\usepackage{pb-diagram,fp,graphicx}
\begin{document}
\makeatletter
\@namedef{dgo@--}{\let\dg@VECTOR=\dg@dashvector}%
\def\dg@dashvector(#1,#2)#3{%
\begingroup
\dg@XTEMP=#1\relax \dg@YTEMP=#2\relax
\let\dg@NDOTS=\dg@XEND \let\dg@DOTDIAM=\dg@WEND
% Find number of dots: make x-spacing be DOTSPACING for arrows
% of |slope| <= 1, and make y-spacing be DOTSPACING otherwise.
% Thus, true spacing is never more than 30% off from DOTSPACING.
\dg@NDOTS=\unitlength \multiply\dg@NDOTS #3\relax
\dg@ZTEMP=\dg@YTEMP \dg@changesign\dg@YTEMP\dg@ZTEMP
\ifnum\dg@XTEMP>\z@
\ifnum\dg@YTEMP>\dg@XTEMP
\multiply\dg@NDOTS\dg@YTEMP \divide\dg@NDOTS\dg@XTEMP \fi
\else\ifnum\dg@XTEMP<\z@
\ifnum\dg@YTEMP>-\dg@XTEMP
\multiply\dg@NDOTS\dg@YTEMP \divide\dg@NDOTS-\dg@XTEMP \fi
\fi\fi
\dg@YTEMP=\dg@ZTEMP
\divide\dg@NDOTS\dgDOTSPACING
\ifnum\dg@NDOTS>\z@\else \dg@NDOTS=\@ne \fi
% Compute increment vector between dots; round to \unitlength's.
% Use NDOTS not DOTSPACING, since DOTSPACING not exactly obeyed.
\dg@ZTEMP=\unitlength \multiply\dg@ZTEMP #3\relax
\divide\dg@ZTEMP\dg@NDOTS
\ifnum\dg@XTEMP=\z@
\dg@changesign\dg@ZTEMP\dg@YTEMP \dg@YTEMP=\dg@ZTEMP
\else
\dg@changesign\dg@ZTEMP\dg@XTEMP
\multiply\dg@YTEMP\dg@ZTEMP \divide\dg@YTEMP\dg@XTEMP
\dg@XTEMP=\dg@ZTEMP
\fi
\divide\dg@XTEMP\unitlength \divide\dg@YTEMP\unitlength
% Draw dotted line with \multiput
% and arrowhead as zero-length \vector
%%% CALCULATE THE ROTATE ANGLE OF THE DASHED LINE
\ifnum\the\dg@XTEMP>0%
\FPdiv\arang{\the\dg@YTEMP}{\the\dg@XTEMP}%
\FParctan\arang{\arang}%
\FPmul\arang{\arang}{57.295}%
\else
\def\arang{90}%
\fi
%%%%%
\begin{picture}(0,0)%
\dg@DOTDIAM=\dgDOTSIZE \divide\dg@DOTDIAM\unitlength
\multiput(0,0)(\dg@XTEMP,\dg@YTEMP){\dg@NDOTS}{%
% \circle*{\dg@DOTDIAM}}% REPLACE THIS LINE WITH THE NEXT
\smash{\rotatebox{\arang}{\rule{2pt}{.5pt}}}}%
\multiply\dg@XTEMP\dg@NDOTS \multiply\dg@YTEMP\dg@NDOTS
\put(\dg@XTEMP,\dg@YTEMP){\vector(#1,#2){0}}%
\end{picture}%
\endgroup}%
\makeatother
\begin{equation}
\begin{diagram}
\node{A}
\arrow{e,t,..}{a}
\arrow{s,l,--}{c}
\arrow{ese,b,1,--}{u}
\node{B}
\arrow{e,t,--}{b}
\node{C}
\arrow{s,r}{d}
\arrow{wsw,b,1}{v} \\
\node{D}
\arrow[2]{e,b}{e}
\node[2]{H}
\end{diagram}
\end{equation}
\end{document}
为了进行比较,以下是该例程的默认行为,未经修改:
答案2
以防万一你改变主意:-)
% arara: pdflatex
\documentclass[12pt]{article}
\usepackage{tikz-cd}
\begin{document}
\begin{equation}
\begin{tikzcd}[every arrow/.append style={-latex}]
A
\arrow[dashed]{r}{a}
\arrow[dashed]{d}[swap]{c}
\arrow[dashed]{drr}[near start,swap]{u}
& B
\arrow[dashed]{r}{b}
& C
\arrow{d}{d}
\arrow{dll}[near start]{v} \\
D \arrow{rr}[swap]{e}
&
&
H
\end{tikzcd}
\end{equation}
\end{document}