我之前问过在 tikzcd 中规范化条目大小的最简单方法但感觉我仍然不了解绘制具有广泛差异的条目大小的相对对称图表的最佳做法。 (我所说的“对称”是指我希望能够确保整体形状为正方形(或旋转的正方形),并且可组合的对角线箭头在适当的情况下实际上是平行的。)
下面是一个示例,我尝试使用从本网站学到的各种技巧,以三种不同的方式进行规范化。
我最理解第一种尝试:\makebox
用于欺骗条目大小并shorten
用于调整箭头的长度。但在实践中,这种方法感觉有点临时。
有人建议在其他地方使用它between origins
,就像我在尝试 2 中所做的那样,但我不明白它实际上有什么作用,或者我的其他选择是什么。在实践中,它似乎一半时间看起来很棒,另一半时间看起来很糟糕(或者像这里一样一半好,一半糟糕)。
第三次尝试我理解得更少了。基本上,我正在寻找一个人来快速介绍不同的潜在技术。这是数百张图表中的一张,所以我需要一个可以修改为具有不同图表形状的许多其他设置的解决方案。
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz-cd}
\usepackage{makebox}
\begin{document}
Attempt 1:
\[
\begin{tikzcd}[column sep=0em, row sep=small]
& & \hom_A(a,A) \underset{X}{\times} \hom_B(B,b) \arrow[dl, two heads, "\pi_1"'] \arrow[dd, phantom, "\rotatebox{135}{$\ulcorner$}" pos=.1] \arrow[dr, two heads, "\pi_0"] \\
& \hom_A(a,A) \arrow[dl, two heads, "p_1"', shorten >=-1em] \arrow[dr, two heads, "p_0"] & & \hom_B(B,b) \arrow[dl, two heads, "p_1"'] \arrow[dr, two heads, "p_0", shorten >=-1em] \\
\makebox*{$\hom_A(a,A)A$}{$A$} & & X & & \makebox*{$A\hom(a,A)_A$}{$B$}
\end{tikzcd}
\]
Attempt 2:
\[
\begin{tikzcd}[column sep={4em,between origins}]
& & \hom_A(a,A) \underset{X}{\times} \hom_B(B,b) \arrow[dl, two heads, "\pi_1"'] \arrow[dd, phantom, "\rotatebox{135}{$\ulcorner$}" pos=.1] \arrow[dr, two heads, "\pi_0"] \\
& \hom_A(a,A) \arrow[dl, two heads, "p_1"'] \arrow[dr, two heads, "p_0"] & & \hom_B(B,b) \arrow[dl, two heads, "p_1"'] \arrow[dr, two heads, "p_0"] \\
\makebox*{$\hom_A(a,A)A$}{$A$} & & X & & \makebox*{$A\hom(a,A)_A$}{$B$}
\end{tikzcd}
\]
Attempt 3:
\[
\begin{tikzcd}[nodes in empty cells, column sep=-3ex, row sep=1em, cells={nodes={minimum width=1em, inner sep=1pt}}]
& & \hom_A(a,A) \underset{X}{\times} \hom_B(B,b) \arrow[dl, two heads, "\pi_1"'] \arrow[dd, phantom, "\rotatebox{135}{$\ulcorner$}" pos=.1] \arrow[dr, two heads, "\pi_0"] \\
& \hom_A(a,A) \arrow[dl, two heads, "p_1"'] \arrow[dr, two heads, "p_0"] & & \hom_B(B,b) \arrow[dl, two heads, "p_1"'] \arrow[dr, two heads, "p_0"] \\
\makebox*{$\hom_A(a,A)A$}{$A$} & & X & & \makebox*{$A\hom(a,A)_A$}{$B$}
\end{tikzcd}
\]
\end{document}
答案1
第一种方法,tikz-cd
由于您的回调是一个非常大的对象,我相信您需要将不同大小的不同行分开,为此您可以使用&[...]
。列也是一样\\[...]
。这可能不是最好的解决方案:
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz-cd}
\begin{document}
\begin{center}
\begin{tikzcd}
&[-5mm]&[-24mm] \hom_A(a,A) \times_X \hom_B(B,b)
\ar[two heads]{ld}\ar[two heads]{rd}
\ar{rd}
\ar[phantom, very near start]{dd}{\rotatebox{-45}{$\lrcorner$}}
\\[3mm]
&
\hom_A(a,A)\ar[two heads]{ld}\ar[two heads]{rd}
&&[-24mm] \hom_B(B,b)\ar[two heads]{ld}\ar[two heads]{rd}\\[3mm]
A && X &&[-5mm] B
\end{tikzcd}
\end{center}
\end{document}
第二种方法tikz
由于我无法找到一种自动方法来实现这一点以及许多其他可能的图表,因此我只能提供一种更简单的方法来获得所需的输出。我将使用calc
库进行一些计算。
我将把回拉部分放在顶部,其他部分都放在下面。根据第一个条目中给出的其他对象的角度和第二个条目中给出的长度,很容易计算出三角形的高度\hom_A(a,A) \times_X \hom_B(B,b)
\hom_A(a,A)
\hom_B(b,B)
。在这种情况下是2 sin(45)
或2 · 1/sqrt(2)
从中可以得出对象的所需长度,X
这里4 · 1/sqrt(2)
是我使用的地方calc
。这不是创建此类图表的自动方法,但至少通过简单的计算,您可以获得所需的输出:
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz-cd}
\usetikzlibrary{calc}
\begin{document}
\[
\begin{tikzpicture}[commutative diagrams/every diagram]
\node (P) at (0:0) {$\hom_A(a,A) \times_X \hom_B(B,b)$};
\node (A) at (225:2) {$\hom_A(a,A)$} ;
\node (B) at (315:2) {$\hom_B(B,b)$};
\node (x) at (270:4/sqrt 2) {$X$};
\node (a) at (225:4) {$A$};
\node (b) at (315:4) {$B$};
\path[commutative diagrams/.cd, every arrow, every label]
(P) edge[->>] (A)
(P) edge[->>] (B)
(A) edge[->>] (a)
(A) edge[->>] (x)
(B) edge[->>] (x)
(B) edge[->>] (b);
\end{tikzpicture}
\]
\end{document}
我[->>]
在每条边上都写字,因为未来图表中的箭头可能不是全部都是同态的。
答案2
你可以通过降低X. 宽的对象被分配较小的宽度。
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz-cd}
\newcommand{\zb}[2][2em]{\makebox[#1]{$\displaystyle#2$}}
\begin{document}
\[
\begin{tikzcd}
& &
\zb{\hom_A(a,A) \underset{X}{\times} \hom_B(B,b)}
\arrow[dl, two heads, "\pi_1"']
\arrow[dd, phantom, "\rotatebox{135}{$\ulcorner$}" pos=.1]
\arrow[dr, two heads, "\pi_0"]
\\
&
\zb{\hom_A(a,A)}
\arrow[dl, two heads, "p_1"']
\arrow[ddr, two heads, "p_0"]
& &
\zb{\hom_B(B,b)}
\arrow[ddl, two heads, "p_1"']
\arrow[dr, two heads, "p_0"]
\\
A & & {} & & B
\\[-2.5em]
&& X
\end{tikzcd}
\]
\end{document}