答案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
参见这里。