为什么我的 tikz 图表左侧有这么多可用空间?

为什么我的 tikz 图表左侧有这么多可用空间?

灵感来自如何绘制蛇形引理中连接同态的“蛇”形箭头?我创建了自己的蛇形图(见下文)。

条目相当大,因此图形太宽。我的问题是:为什么图形只从页面中间开始,而不是从左侧开始?为什么左边有这么多的空闲空间?

\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\begin{document}
\begin{tikzpicture}[descr/.style={fill=white,inner sep=1.5pt}]
        \matrix (m) [
            matrix of math nodes,
             row sep=1em,
             column sep=2em,
        ]
        { Q_{5}\oplus\bigoplus_{i\in\{1,2,3,4\}} Q_{12345\setminus i}[1] &
        \bigoplus_{l\in\{1,2,3,4\}} Q_{l5}\oplus Q_{12345}[1] &
        \bigoplus_{j\neq k\in\{1,2,3,4\}} Q_{jk5} \\
          \bigoplus_{i\in\{1,2,3,4\}} Q_{12345\setminus i} &
        Q_{12345} &
        S_{12345} \\
        };
        \path[->, font=\scriptsize,>=latex]
        (m-1-1) edge (m-1-2)
        (m-1-2) edge (m-1-3)
        (m-1-3) edge[out=355,in=175] (m-2-1)
    (m-2-1) edge (m-2-2)
        (m-2-2) edge (m-2-3);
\end{tikzpicture}
\end{document}

答案1

弯曲边缘会使边界框增大很多。这可以视为一个错误。要取消该效果,请添加绘制箭头 overlay的选项。\path

你也可以考虑使用\limitses\bigoplus\mathclap(参考)以使下标占用更少的空间。这是我的版本:

\def\mathclap{\mathpalette\mathclapinternal}
\def\mathclapinternal#1#2{\clap{$\mathsurround=0pt#1{#2}$}}
\let\oldbigoplus=\bigoplus
\def\bigoplus{\oldbigoplus\limits}

\begin{tikzpicture}[remember picture=true]
        \matrix (m) [
            matrix of math nodes,
             row sep=1em,
             column sep=2em,
             text height=1.5ex, text depth=0.25ex
        ]
        {Q_{5}\oplus\bigoplus_{\mathclap{i\in\{1,2,3,4\}}} Q_{12345\setminus i}[1] &
        \bigoplus_{\mathclap{l\in\{1,2,3,4\}}} Q_{l5}\oplus Q_{12345}[1] &
        \bigoplus_{\mathclap{j\neq k\in\{1,2,3,4\}}} Q_{jk5} \\
          \bigoplus_{\mathclap{i\in\{1,2,3,4\}}} Q_{12345\setminus i} &
        Q_{12345} &
        S_{12345} \\
        };
        \path[overlay,->, font=\scriptsize,>=latex]
        (m-1-1) edge (m-1-2)
        (m-1-2) edge (m-1-3)
        (m-1-3) edge[out=348,in=172] (m-2-1)
        (m-2-1) edge (m-2-2)
        (m-2-2) edge (m-2-3);
\end{tikzpicture}

图表

PS:descr/.style=...除非您实际将样式应用于某些对象,否则您的声明不会产生任何效果。因此,您可以出于简单示例目的而删除该声明。

编辑:我已经采纳了@Caramdir 建议的编辑。

答案2

在 Matthew 的版本上还有一些其他的小改进:在原始示例中,我删除了text height=1.5ex, text depth=0.25ex通常添加的箭头,以使文本复杂化。但是,这里有必要这样做。此外,弯曲箭头的起始和终止方向也需要稍微调整一下:

\documentclass{article}
\usepackage{tikz,mathtools} %mathtools provides \mathclap
\usetikzlibrary{matrix,arrows}

\let\oldbigoplus=\bigoplus
\def\bigoplus{\oldbigoplus\limits}

\begin{document}

\begin{tikzpicture}
        \matrix (m) [
            matrix of math nodes,
            row sep=2.5em,
            column sep=2em,
            text height=1.5ex, text depth=0.25ex
        ]
        {Q_{5}\oplus\bigoplus_{\mathclap{i\in\{1,2,3,4\}}} Q_{12345\setminus i}[1] &
        \bigoplus_{\mathclap{l\in\{1,2,3,4\}}} Q_{l5}\oplus Q_{12345}[1] &
        \bigoplus_{\mathclap{j\neq k\in\{1,2,3,4\}}} Q_{jk5} \\
          \bigoplus_{\mathclap{i\in\{1,2,3,4\}}} Q_{12345\setminus i} &
        Q_{12345} &
        S_{12345} \\
        };

        \path[overlay,->, font=\scriptsize,>=latex]
        (m-1-1) edge (m-1-2)
        (m-1-2) edge (m-1-3)
        (m-1-3) edge[out=348,in=172] (m-2-1)
        (m-2-1) edge (m-2-2)
        (m-2-2) edge (m-2-3);
\end{tikzpicture}
\end{document}

渲染代码

答案3

这绝对是弯曲的路径将物体向外推。要查看此情况,您可以通过以下方式在特定点绘制边界框:

\draw (current bounding box.north west) rectangle (current bounding box.south east);

在适当的时机,比如在命令之后\matrix和命令之后\path。请注意,这会绘制当前的边界框,因此将其放在不同的地方可以显示边界框在图表中如何变化。

作为替代解决方案,\useasboundingbox设置图片的边界框。准确地说,这意味着就边界框而言,此命令之后的所有内容都将被忽略。因此,将其放在矩阵命令之后但在路径命令之前意味着矩阵用于边界框,但路径不用于边界框。因此我的解决方案是:

\documentclass{article}
\thispagestyle{empty}
\usepackage[scale=.96]{geometry}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\begin{document}
\begin{tikzpicture}
        \matrix (m) [
            matrix of math nodes,
             row sep=2em,
             column sep=2em,
        ]
        { Q_{5}\oplus\bigoplus_{i\in\{1,2,3,4\}} Q_{12345\setminus i}[1] &
        \bigoplus_{l\in\{1,2,3,4\}} Q_{l5}\oplus Q_{12345}[1] &
        \bigoplus_{j\neq k\in\{1,2,3,4\}} Q_{jk5} \\
          \bigoplus_{i\in\{1,2,3,4\}} Q_{12345\setminus i} &
        Q_{12345} &
        S_{12345} \\
        };
        \useasboundingbox (0,0);
        \path[->, font=\scriptsize,>=latex]
        (m-1-1) edge (m-1-2)
        (m-1-2) edge (m-1-3)
        (m-1-3) edge[out=355,in=175] (m-2-1)
    (m-2-1) edge (m-2-2)
        (m-2-2) edge (m-2-3);
\end{tikzpicture}
\end{document}

标签的效果overlay类似。该标签将路径从边界框考虑中移除,而\useasboundingbox将移除其后的所有内容(但不包括其自身)。

相关内容