画图学习代码

画图学习代码

在此处输入图片描述

我正在尝试学习绘制此类图表的代码。有没有书可以阅读以了解其代码?谢谢!

答案1

原始图片是用xy包完成的(您可以看到提示)。也可以用它构建交换图,amscd但它们是有点旧的包,即使我更喜欢它们,而不是tikz-cd好用户提到的通用包@Manuel Kuehner 博士:-)。这是代码,

\documentclass[a4paper,12pt]{article}
\usepackage[all]{xy}
\begin{document}
\xymatrix{
Q \ar@/_1pc/[ddr]_j \ar@/^/[drr]^{m} \ar@/^1pc/[drrr]^{i}\\
& A \ar[d]_p \ar[r]^q & B \ar[d]_q  \ar[r]^g &  C \ar[d]^r\\
& X \ar[r]_u & Y  \ar[r]_v & Z}
\end{document}

输出如下:

在此处输入图片描述

如果您不喜欢定义交换图的向量尖端,我建议您使用选项cmtip,您将获得与 相同的外观tikz-cd。如果您想将图形居中,我建议在环境中\[编写代码。\]\xymatrix

\documentclass[a4paper,12pt]{article}
\usepackage[all,cmtip]{xy}
\begin{document}
\xymatrix{
Q \ar@/_1pc/[ddr]_j \ar@/^/[drr]^{m} \ar@/^1pc/[drrr]^{i}\\
& A \ar[d]_p \ar[r]^q & B \ar[d]_q  \ar[r]^g &  C \ar[d]^r\\
& X \ar[r]_u & Y  \ar[r]_v & Z}
\end{document}

在此处输入图片描述

答案2

为了补充 Sebastiano 的非常好的答案,下面是一个实现tikz-cd

就像在 Xy-pic 中一样,您必须将图表视为一个矩阵,并指示用 表示r“右”,d用 表示“下”,从而指定目标单元格。标签位于双引号之间,'右引号后面的 表示“交换标签位置”(通常在箭头左侧)。

箭头bend left=20略微向左弯曲(想象河流,想象自己身处源头并看向终点来确定左右)。

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd}

\begin{document}

\[
\begin{tikzcd}
Q \arrow[rdd,bend right=20,"j"']
  \arrow[rrd,bend left=20,"m"']
  \arrow[rrrd,bend left=20,"i"] \\
& A \arrow[r,"f"] \arrow[d,"p"]
& B \arrow[r,"g"] \arrow[d,"q"]
& C \arrow[d,"r"] \\
& X \arrow[r,"u"'] & Y \arrow[r,"v"'] & Z
\end{tikzcd}
\]

\end{document}

在此处输入图片描述

答案3

另一种方法是,你不需要添加太多的普通元帖子生成看起来合理的交换图。不过我认为,只有当您已经在文档的其他地方使用 MP 时,我才会推荐这种方法。

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
% draw labelled arrow along Path
vardef labelled_arrow(expr Path, Label, Offset, Time) = 
    drawarrow Path 
        cutbefore fullcircle scaled 14 shifted point 0 of Path
        cutafter  fullcircle scaled 18 shifted point infinity of Path;
    draw thelabel(Label, origin) scaled 0.8 shifted point Time of Path 
        shifted (unitvector(direction Time of Path rotated 90) scaled Offset);
enddef;

beginfig(1);
    x1 = x4; 
    x2 = x5;
    x3 = x6;

    y1 = y2 = y3;
    y4 = y5 = y6;

    x3 - x2 = x2 - x1 = y1 - y4  = 48;

    z0 = origin;
    z1 = 52 dir -56;

    numeric i; i=-1;
    forsuffixes @=Q, A, B, C, X, Y, Z: 
        label("$" & str @ & "$", z[incr i]); 
    endfor

    interim ahangle := 20; % very pointy arrows...

    labelled_arrow(z1--z2, "$f$", 6, 1/2);
    labelled_arrow(z2--z3, "$g$", 5, 1/2);
    labelled_arrow(z4--z5, "$u$", -5, 1/2);
    labelled_arrow(z5--z6, "$v$", -5, 1/2);
    labelled_arrow(z1--z4, "$p$", 5, 1/2);
    labelled_arrow(z2--z5, "$q$", 5, 1/2);
    labelled_arrow(z3--z6, "$r$", 5, 1/2);

    labelled_arrow(z0 {right}   .. z3, "$i$",  6, 3/8);
    labelled_arrow(z0 {down}    .. z4, "$j$", -5, 3/8);
    labelled_arrow(z0 {dir -10} .. z2, "$m$", -6, 3/8);

endfig;
\end{mplibcode}
\end{document}

补充说明

那些喜欢 TeX 风格箭头的人可以添加这个:

input cmarrows
setup_cmarrows(arrow_name = "texarrow"; parameter_file = "cmr6.mf"; macro_name = "drawarrow");

之前beginfig(1)得到这样的版本:

在此处输入图片描述

更多信息请cmarrows参见这里

相关内容