我想要排版一个像下图这样的格子;在左边,两个节点似乎占据与它们上方的节点相同的水平间距,但仍然可以独立地绘制往返于它们之间的箭头。
如果我使用虚拟列
\begin{tikzcd}[column sep = tiny]
&&& &&& &G \\
&&& &&\<\sigma^2, \tau\>& &\<\sigma\> &&\<\sigma^2, \tau\sigma\> \\
&&\<**\>& &&\<\sigma^4, \tau\>& &\<\sigma^2\> &&\<**\>& &&\<**\> \\
&\<\tau \sigma^2\>&&\<**\> &\<**\>&&\<\tau\> &\<\sigma^4\> \\
&&& &&& &{\bf 1}
\end{tikzcd}
答案1
\subnode
以下是一个解决方案tikzmark
包/库。这将需要remember picture
密钥并将一些行写入文件.aux
。(有一种解决方案可以做到这一点,而无需所有这些,但使用标签,但这tikzmark
使得它非常简单并且易于适应两个以上的子节点。)
使用宏\twoparts
可以排版一个节点,但tikzmark
库会围绕两个部分创建伪节点(名称与实际节点相同,但带有后缀-l
和)。稍后可以使用/ / /-r
引用这些名称,而无需明确为这些节点指定自定义名称(或弄清楚它们实际上位于哪个单元格中)。from left
from right
to left
to right
各部分之间用空格隔开(请注意~
),但您可以随意设置。也许用\quad
可以更好地区分两个部分。
这一切意味着我们仍然可以使用正常的\ar
目标规范,ldru
但只需要指定我们想要源或目标单元格的左侧还是右侧。
为了更容易地指定这些箭头,我定义了几个键:
to left
/to right
,from left
/from right
,to Left
与 相同,to left
但选择南锚点。 也一样to Right
。(我认为当边缘来自顶部时,没有必要相同。)这些是针对此用例的,因为这些连接的角度有点不幸(源图像也是如此)。
我还定义了\ar
快捷方式,因为您总是需要到两个子节点的边。
\tolr
向两个子节点添加边,\toLR
添加边缘到两个子节点,但选择south
这些子节点处的锚点。
与业务无关\subnode
,但我还添加了\ldrar
在源单元格的左、中、右“子”单元格上绘制边缘。
我正在使用适当的 LaTeX 宏\mathbf
而\bf
不是1
。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{cd,tikzmark}
\def\<#1\>{\langle#1\rangle}% I guess …
\newcommand*{\twoparts}[3][]{%
\subnode[#1]{\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn-l}{#2}~%
\subnode[#1]{\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn-r}{#3}}
\makeatletter
\tikzcdset{
from left/.style={from/.expanded=\tikzcd@ar@start-l},
from right/.style={from/.expanded=\tikzcd@ar@start-r},
to left/.style={to/.expanded=\tikzcd@ar@target-l},
to right/.style={to/.expanded=\tikzcd@ar@target-r},
}
\makeatother
\tikzcdset{
to Left/.style={to left, end anchor=south},
to Right/.style={to right, end anchor=south},
install my shortcuts/.code={%
\newcommand*\ldrar{\dlar\dar\drar}%
\newcommand*\tolr[1][]{\ar[##1,to left]\ar[##1,to right]}%
\newcommand*\toLR[1][]{\ar[##1,to Left]\ar[##1,to Right]}%
}
}
\begin{document}
\begin{tikzcd}[
remember picture,
column sep = tiny,
arrows=-, crossing over clearance=3pt,
install my shortcuts]
& & G \ldrar \\
& \<\sigma^2, \tau\> \ldrar
& \<\sigma\> \dar
& \<\sigma^2, \tau\sigma\> \ldrar \\
\<**\> \tolr[d]
& \<\sigma^4, \tau\> \tolr[d]\drar
& \<**\> \dar
& \<**\> \dlar
& \<**\> \ar[dll] \\
\twoparts{\<\tau \sigma^2\>}{\<**\>}
& \twoparts{\<**\>}{\<\tau\>}
& \<\sigma^4\> \dar \ar[ull, crossing over] \\
& & \mathbf{1} \toLR[ul]\toLR[ull]
\end{tikzcd}
\end{document}