我想使用 xypic 绘制类似于这样的哈斯图:
它是用以下代码生成的:
\documentclass{article}
\usepackage[all]{xy}
\begin{document}
\[
\xymatrix{
s_{2,0} \ar@{-}[d] \ar@{-}[drrr] & &
s_{2,1} \ar@{-}[dl] \ar@{-}[dr] & &
s_{2,2} \ar@{-}[dlll] \ar@{-}[d] \\
s_{1,0} \ar@{-}[drr] &
s_{1,1} \ar@{-}[dr] &&
s_{1,2} \ar@{-}[dl] &
s_{1,3} \ar@{-}[dll] \\
& & s_{0} & & }
\]
\end{document}
唯一的问题是第二行的第二和第三条目之间有太多空间。显然,我使用了五列,因为第一行和第三行的条目数量是奇数。有什么办法可以缩小这个差距吗?在上图中,这不是什么大问题,但那张图只是我第一次尝试正确编写代码。这是实际的图表:
哎呀! 它甚至不适合这个页面!(这是右侧的页面边框,如我的 PDF 查看器所示。)它是使用与上面相同的代码生成的,但增加了一个生成有序三元组的命令。
下面是我想要做的事情的一个例子:
注意第二行四个条目之间的间距相等。此图来自精彩的讨论关于使用 TikZ 绘制 Hasse 图,但我更喜欢使用 xypic。出于某种原因,TikZ 不想与我的安装配合。我尝试使用以下代码制作我的图表,使用 TikZ 示例作为模型:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=.7]
\node (20) at (-3,2) {$s_{2,0}$};
\node (21) at (0,2) {$s_{2,1}$};
\node (20) at (3,2) {$s_{2,2}$};
\node (10) at (-3,0) {$s_{1,0}$};
\node (11) at (-1,0) {$s_{1,1}$};
\node (12) at (1,0) {$s_{1,2}$};
\node (13) at (3,0) {$s_{1,3}$};
\node (00) at (0,-2) {$s_{0}$};
\draw (00) -- (10) -- (20) -- (12) -- (00) --(11) -- (22) -- (13) --(00);
\draw (10) -- (21) -- (13);
\end{tikzpicture}
\end{document}
但编译时却没有成功:
! Undefined control sequence.
l.1837 \pgfdeclareplotmark
{ball}
也许我古老的 OpenBSD 服务器上的 LaTeX 安装已经过时了,但升级它是一项艰巨的任务,所以如果可能的话我宁愿使用 xypic。
答案1
目前还不清楚您应该使用\xymatrix
什么。我将首先讨论可用的选项,更正您的tikz
代码,然后展示如何tikz
在中实现该代码xy
。
您可以\xymatrix
使用指令设置列间距@C=
并指定一个尺寸,例如1em
。为了有机会实现相等的间距,您需要为相应的条目设置相等数量的列。开始是:
\documentclass{article}
\usepackage[all]{xy}
\begin{document}
\[
\xymatrix@C=0em{
s_{2,0} \ar@{-}[d] \ar@{-}[drrrr] &&&
s_{2,1} \ar@{-}[dlll] \ar@{-}[drrr] &&&
s_{2,2} \ar@{-}[dllll] \ar@{-}[d] \\
s_{1,0} \ar@{-}[drrr] &&
s_{1,1} \ar@{-}[dr] &&
s_{1,2} \ar@{-}[dl] &&
s_{1,3} \ar@{-}[dlll] \\
&&& s_{0} &&& }
\]
\end{document}
现在有一个版本@!C=
可以强制等间距,但在这种情况下会使图表更宽。您可以使用@C=
负尺寸来进一步压缩内容,但在该版本中使用负尺寸@!C=
会产生意想不到的效果。
在您预期的示例中,您或许应该考虑使节点变窄的方法,例如通过垂直堆叠节点材料,使用类似
\txt{\( s_{1,0} \)\\\( \scriptstyle\langle\{\varphi_3\},\{\varphi_4\}\rangle \)}
您的tikz
代码只有一个编译问题,节点命名(22)
错误:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=.7]
\node (20) at (-3,2) {$s_{2,0}$};
\node (21) at (0,2) {$s_{2,1}$};
\node (22) at (3,2) {$s_{2,2}$}; %Corrected node name
\node (10) at (-3,0) {$s_{1,0}$};
\node (11) at (-1,0) {$s_{1,1}$};
\node (12) at (1,0) {$s_{1,2}$};
\node (13) at (3,0) {$s_{1,3}$};
\node (00) at (0,-2) {$s_{0}$};
\draw (00) -- (10) -- (20) -- (12) -- (00) --(11) -- (22) -- (13) --(00);
\draw (10) -- (21) -- (13);
\end{tikzpicture}
\end{document}
现在xy
您可以进行类似的构造。
\documentclass{article}
\usepackage[all]{xy}
\begin{xy}
0;<0.5cm,0pt>:
(-3,2)*{s_{2,0}}="20";
(0,2)*{s_{2,1}}="21";
(3,2)*{s_{2,2}}="22";
(-3,0)*{s_{1,0}}="10";
(-1,0)*{s_{1,1}}="11";
(1,0)*{s_{1,2}}="12";
(3,0)*{s_{1,3}}="13";
(0,-2)*{s_{0}}="00";
"10" **\dir{-};
"20" **\dir{-};
"12" **\dir{-};
"00" **\dir{-};
"11" **\dir{-};
"22" **\dir{-};
"13" **\dir{-};
"00" **\dir{-};
"10";
"21" **\dir{-};
"13" **\dir{-};
\end{xy}
\end{document}
您使用xy
而不是xymatrix
。然后在第一行设置坐标系,其原点在0
,x 单位向量在(0.5cm,0)
。
之后,您可以通过指定坐标并将材料通过放置到点来(x,y)
放置材料*{material}
。该位置通过添加最后的来命名="name"
。
一旦点被命名,您就可以连接它们。您记下起始位置,"name";
然后将第二个点连接到该位置以"name2" **\dir{-};
产生直线。现在"name2"
是您的最后一个位置,您只需添加类似的构造即可将其连接到"name3"
。上面的代码中"00"
已经是最后提到的坐标,因此我们不需要重复它和连接过程的开始。
您应该参阅完整的xy
参考手册texdoc xyref
以获取有关改善间距等的更多详细信息。您将在那里看到,对于这些特定的边缘,您可以写出更短的@{-}
而不是\dir{-}
。