![xypic 边界框](https://linux22.com/image/392827/xypic%20%E8%BE%B9%E7%95%8C%E6%A1%86.png)
我正在使用 xymatrix 绘制马尔可夫链图。它看起来很棒,但是边界框计算不正确,因此与其他文本重叠。
这特别糟糕,因为我也在standalone
脚本上使用它,而且生成的图像太过裁剪。
遵循 MWE:
\documentclass{article}
\usepackage{lipsum}
\usepackage[all]{xy}
\begin{document}
\lipsum[1]
\begin{figure}[h]
\[\xymatrix{
& a \ar@(ul,ur) \ar@/^/[rr] \ar@/^/[dd] \ar@/^/[ddrr] \ar@/^4pc/[rrrd]
&
& b \ar@(ul,ur) \ar@/^/[ll] \ar@/^/[dd] \ar@/^/[ddll] \ar[dr]
\\
begin \ar[ur] \ar[dr] \ar@/^4pc/[urrr]\ar@/_4pc/[drrr]
&
&
&
& end
\\
& c \ar@(dr,dl) \ar@/^/[rr] \ar@/^/[uu] \ar@/^/[uurr] \ar@/_4pc/[rrru]
&
& d \ar@(dr,dl) \ar@/^/[ll] \ar@/^/[uu] \ar@/^/[uull] \ar[ur]
}\]
\caption{Exemplo de uma cadeia de Markov\label{mkv1}}
\end{figure}
\lipsum[1]
\end{document}
有什么提示可以说明如何将 xymatrix 包装到什么地方,以强制它完全显示?
谢谢
编辑:有点相关在 xymatrix 中为对象分组的框添加填充,但我不想为每个不同的图像指定填充......
答案1
如果您添加\fbox{...}
构造\xymatrix
,您会看到边界框由节点“a,b,c,d,begin,end”确定。
(我做了一些更改:首先,我添加了可产生合适箭头提示的cmtip
选项,然后键入了“和”作为文本节点。)xy
\txt{begin}
\txt{end}
Xy-pic 从来不会考虑弯曲的箭头来确定边界框。你可以用以下规则手动调整它:
\documentclass{article}
\usepackage{lipsum}
\usepackage[all,cmtip]{xy}
\begin{document}
\lipsum[1]
\begin{figure}[htp]
\[
\fboxsep=0pt
\fbox{%
\vrule height 7ex depth 24.5ex width 0pt
\xymatrix{
& a \ar@(ul,ur) \ar@/^/[rr] \ar@/^/[dd] \ar@/^/[ddrr] \ar@/^4pc/[rrrd]
&
& b \ar@(ul,ur) \ar@/^/[ll] \ar@/^/[dd] \ar@/^/[ddll] \ar[dr]
\\
\txt{begin} \ar[ur] \ar[dr] \ar@/^4pc/[urrr]\ar@/_4pc/[drrr]
&
&
&
& \txt{end}
\\
& c \ar@(dr,dl) \ar@/^/[rr] \ar@/^/[uu] \ar@/^/[uurr] \ar@/_4pc/[rrru]
&
& d \ar@(dr,dl) \ar@/^/[ll] \ar@/^/[uu] \ar@/^/[uull] \ar[ur]
}}
\]
\caption{Exemplo de uma cadeia de Markov\label{mkv1}}
\end{figure}
\lipsum[1]
\end{document}
调整高度和深度直到满意为止然后移除该\fbox
部件:
\documentclass{article}
\usepackage{lipsum}
\usepackage[all,cmtip]{xy}
\begin{document}
\lipsum[1]
\begin{figure}[htp]
\[
\vrule height 7ex depth 24.5ex width 0pt
\xymatrix{
& a \ar@(ul,ur) \ar@/^/[rr] \ar@/^/[dd] \ar@/^/[ddrr] \ar@/^4pc/[rrrd]
&
& b \ar@(ul,ur) \ar@/^/[ll] \ar@/^/[dd] \ar@/^/[ddll] \ar[dr]
\\
\txt{begin} \ar[ur] \ar[dr] \ar@/^4pc/[urrr]\ar@/_4pc/[drrr]
&
&
&
& \txt{end}
\\
& c \ar@(dr,dl) \ar@/^/[rr] \ar@/^/[uu] \ar@/^/[uurr] \ar@/_4pc/[rrru]
&
& d \ar@(dr,dl) \ar@/^/[ll] \ar@/^/[uu] \ar@/^/[uull] \ar[ur]
}
\]
\caption{Exemplo de uma cadeia de Markov\label{mkv1}}
\end{figure}
\lipsum[1]
\end{document}
答案2
评论太长了。这是 tikz 版本。这有相反的问题,这里的边界框实际上太大了。
\documentclass{standalone}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
{} & a\mathstrut
\arrow[loop above]
\ar[dd,bend left=10]
\ar[rr,bend left=10]
\ar[rrdd,bend left=10]
\ar[rrrd,out=45,in=95,looseness=1.5]
&
& b\mathstrut
\arrow[loop above]
\ar[dd,bend left=10]
\ar[ll,bend left=10]
\ar[lldd,bend left=10]
\ar[rd]
\\
begin\mathstrut
\ar[ru]
\ar[rd]
\arrow[rrru,out=85,in=135,looseness=1.5]
\ar[rrrd,out=-85,in=-135,looseness=1.5]
&
&
&
& end\mathstrut
\\
{} & c\mathstrut
\ar[uu,bend left=10]
\ar[rr,bend left=10]
\ar[uurr,bend left=10]
\arrow[loop below]
\ar[rrru,out=-45,in=-95,looseness=1.5]
&
& d\mathstrut
\ar[uu,bend left=10]
\ar[ll,bend left=10]
\ar[uull,bend left=10]
\arrow[loop below]
\ar[ru]
\\
\end{tikzcd}
\end{document}
您可以轻松地玩箭头
\usetikzlibrary{arrows,arrows.meta}
\tikzcdset{
arrow style=tikz,
diagrams={>=Latex[round]}
}