tikz-cd 中的 \Mapsto

tikz-cd 中的 \Mapsto

我很喜欢使用 tikz-cd 绘制编译器正确性图表,但我无法获得与文本中使用的关系完全相同的箭头。特别是,我不确定如何进入\Mapstotikz-cd 图表。

我确实尝试过结合箭头选项来开始\Mapsto工作:

\documentclass{article}

\usepackage{tikz}
\usepackage{tikz-cd}

\begin{document}

\begin{tikzcd}
  M \rar[Rightarrow] \dar[maps to] & N \dar[maps to, Rightarrow] \\
  M' \rar[Rightarrow, maps to] & N'
\end{tikzcd}

\end{document}

但这最终并不令人满意(在 TeXLive 2013 上):

乱码箭头

如您所见,根据我给出参数的顺序,该栏要么缺失(N 到 N 箭头上应该有一个),要么大得可笑。我猜这是一个错误?有已知的解决方法吗?

答案1

我看了\Mapstostmaryrdcm |我已将其用作重新定义遵循直线的箭头的模型的包double

3.3值是近似的,因此垂直线与implies箭头一样宽(类似于外观)。示例中的\Mapsto原始箭头的条相当短。maps to

代码

\documentclass[tikz]{standalone}
\usepackage{tikz-cd}
\expandafter\let\csname pgf@arrow@code@cm |\endcsname\relax
\makeatletter
\pgfarrowsdeclare{cm |}{cm |}{%
  \[email protected]\pgflinewidth
  \ifdim\pgfinnerlinewidth>0pt\relax
    \pgfmathaddtolength\pgfutil@tempdima{-.5*\pgfinnerlinewidth}%
  \fi
  \pgfarrowsleftextend{+-\pgfutil@tempdima}%
  \pgfarrowsrightextend{+\pgfutil@tempdima}%
}{%
  \ifdim\pgfinnerlinewidth=0pt\relax
    \pgfutil@tempdima4\pgflinewidth
  \else
    \pgfutil@tempdima\pgflinewidth
    \advance\pgfutil@tempdima-\pgfinnerlinewidth
    \pgfsetlinewidth{\pgfutil@tempdima/2}%
    \multiply\[email protected]\relax
  \fi
  \pgfsetdash{}{+0pt}%
  \pgfsetroundcap
  \pgfpathmoveto{\pgfqpoint{0pt}{-\pgfutil@tempdima}}%
  \pgfpathlineto{\pgfqpoint{0pt}{\pgfutil@tempdima}}%
  \pgfusepathqstroke
}
\makeatother
\pgfqkeys{/tikz/commutative diagrams}{
  Maps to/.style={
    /tikz/commutative diagrams/Rightarrow,
    /tikz/commutative diagrams/maps to},
  Maps from/.style={
    /tikz/commutative diagrams/Leftarrow,
    /utils/exec=\pgfsetarrowsend{cm |}}
}
\begin{document}
\begin{tikzcd}
  M  \rar[Maps from] \dar[maps to]  & N \dar[Maps to] \\
  M' \rar[Maps to]    & N'
\end{tikzcd}
\end{document}

输出

在此处输入图片描述

答案2

从 0.9c 版本(如果不是更早版本)开始,tikz-cd 现在提供了一个Mapsto箭头。

相关内容