我试图让 tikz 自动机适合页面,使用独立的 documentclass 预编译图形,然后使用\includegraphics[width=\textwidth{}
(这在Tikz 自动机放置得太靠右)。我犯了一个错误,将 tikzpicture 嵌套在center
环境中,从而在自动机前面插入了一个空白页。因此 \includegraphics{}
只包含空白的第一页。为什么包含center
环境会导致独立页面增加?
以下是最初有问题的、大多是最小的 MWE:
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows,automata,positioning}
\begin{document}
\begin{center}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\node[initial,state, accepting, align = center] (A) {*\textsc{NonHigh}\\Id-hi \\ Id-low \\ Id-hi\& low};
\path (A) edge [loop right, align=center] node {a:i \\ {$ \langle 0, 1, 1, 1 \rangle $} } (A)
edge [loop above, align=center] node {a:e \\ {$ \langle 1, 0, 1, 0 \rangle $}} (A)
edge [loop below, align=center] node {a:a \\ {$\langle 2, 0, 0, 0\rangle$}} (A);
\foreach \looseness/\label [count=\n] in {8/e:e \\ {$ \langle 1, 0, 0, 0 \rangle $}, 12/i:e \\ {$ \langle 1, 1, 0, 0 \rangle $}}
\path [->] (A) edge [
loop above, align = center,
every loop/.append style={
looseness=\looseness,
in=60-0.8*\looseness,
out=120+0.8*\looseness
}] node {\label} ();
\foreach \looseness/\label [count=\n] in {10/e:i \\ {$\langle 0, 1, 0, 0\rangle$}, 15/i:i \\{ $\langle 0, 0, 0, 0 \rangle$} }
\path [->] (A) edge [
loop right, align = center,
every loop/.append style={
looseness=\looseness,
in=330-0.8*\looseness,
out=30+0.8*\looseness
}] node {\label} ();
\foreach \looseness/\label [count=\n] in {8/e:a \\ {$ \langle 2, 0, 1, 0 \rangle $}, 12/i:a \\ {$\langle 2, 1, 1, 1\rangle$} }
\path [->] (A) edge [
loop below, align = center,
every loop/.append style={
looseness=\looseness,
in=240-0.8*\looseness,
out=300+0.8*\looseness
}] node {\label} ();
\end{tikzpicture}
\end{center}
\end{document}
答案1
这里对环境为什么没有意义的解释center
是很好的,但它们并没有解释为什么你会得到一个空白页,而不是环境被默默地或嘈杂地忽略或出现错误。
这里有一种方法可以让您了解为什么您会得到空白页而不是center
环境被忽略。
etoolbox
定义了一些命令,这些命令对于研究宏的含义很有用。关键的背景信息是环境实际上只是匹配的命令对。因此,对于任何\begin{envname}... \end{envname}
,都有一个 ,\envname... \endenvname
这就是 LaTeX 在后台实现环境的方式。因此,我们要寻找 的含义\center
。
\documentclass[tikz]{standalone}
\usepackage{etoolbox}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\begin{document}
\verb|\begin{center}| is defined in terms of a command \verb|\center|\dots
What does \verb|\center| mean?
\csmeaning{center}
% Second run using information obtained on first run
OK.
What does \verb|\trivlist| mean?
\csmeaning{trivlist}
And \verb|\centering|?
\csmeaning{centering}
\dots
\end{document}
如您所见,启动center
环境会做很多事情。\csmeaning{}
如果您愿意,可以通过输入其他宏来进一步跟踪结果。
因此,基本上,当你启动环境时,一堆东西会被放在文档的第一页上center
。诚然,它基本上只是空间但空间就像字母、数字、图片和东西一样。
现在tikzpicture
是 识别的默认环境standalone
。您可以使用 设置非默认环境\standaloneenv{}
,它们将以相同的方式处理。每次启动这样的“特殊”环境时,都会执行standalone
一系列操作。特别是,它确保内容在单独的页面上排版。由于环境启动的页面上已经有内容center
,standalone
因此为 启动一个新页面tikzpicture
。
至少,我是这么认为的。这是我目前的理解。也许有人可以建议更正/改进这个答案。
答案2
环境center
对于类来说是多余的standalone
,因为它会剪切您正在创建的图片之外的所有内容。
因此不需要,图片将始终居中。使用此类时删除环境即可解决该问题。
答案3
第一页是由环境引起的,这center
一点已经解释过了。因此边界框的修复仍然存在,由于循环的控制点,边界框太大了。
边界框由四个节点决定。不幸的是,节点start
没有名称。但由于它是第一个节点,因此使用实际的左边界框边框。
循环\foreach
已按顺序排序,外部节点排在最后。因此,(tmp)
为节点赋予一个临时名称,并将外部边界记住在(bbnorth)
、(bbeast)
和 中(bbsouth)
。
最后构建最终坐标(bbll)
和(bbur)
,其中包含最终边界框的左下角和右上角。由于节点具有inner sep
默认值0.3333em
,因此边界框会进行相应的校正。
然后\pgfresetboundingbox
抛弃当前边界框并[use as bounding box]
启用边界框记录,该边界框由左下角(bbll)
和右上角建立(bbur)
。
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows,automata,positioning}
\begin{document}
\begin{tikzpicture}[
->,
>=stealth',
shorten >=1pt,
auto,
node distance=2.8cm,
semithick,
]
\node[initial,state, accepting, align = center] (A)
{*\textsc{NonHigh}\\Id-hi \\ Id-low \\ Id-hi\& low};
\coordinate (bbwest) at (current bounding box.west);
\path (A) edge [loop right, align=center]
node {a:i \\ {$ \langle 0, 1, 1, 1 \rangle $} } (A)
edge [loop above, align=center]
node {a:e \\ {$ \langle 1, 0, 1, 0 \rangle $}} (A)
edge [loop below, align=center]
node {a:a \\ {$\langle 2, 0, 0, 0\rangle$}} (A);
\foreach \looseness/\label [count=\n] in {%
8/e:e \\ {$ \langle 1, 0, 0, 0 \rangle $},
12/i:e \\ {$ \langle 1, 1, 0, 0 \rangle $}}
\path [->] (A)
edge [
loop above,
align = center,
every loop/.append style={
looseness=\looseness,
in=60-0.8*\looseness,
out=120+0.8*\looseness
}
]
node (tmp) {\label} ();
\coordinate (bbnorth) at (tmp.north);
\foreach \looseness/\label [count=\n] in {%
10/e:i \\ {$\langle 0, 1, 0, 0\rangle$},
15/i:i \\{ $\langle 0, 0, 0, 0 \rangle$}}
\path [->] (A)
edge [
loop right,
align = center,
every loop/.append style={
looseness=\looseness,
in=330-0.8*\looseness,
out=30+0.8*\looseness
}]
node (tmp) {\label} ();
\coordinate (bbeast) at (tmp.east);
\foreach \looseness/\label [count=\n] in {%
8/e:a \\ {$ \langle 2, 0, 1, 0 \rangle $},
12/i:a \\ {$\langle 2, 1, 1, 1\rangle$}}
\path [->] (A)
edge [
loop below,
align = center,
every loop/.append style={
looseness=\looseness,
in=240-0.8*\looseness,
out=300+0.8*\looseness
}]
node (tmp) {\label} ();
\coordinate (bbsouth) at (tmp.south);
\path
(bbwest |- bbsouth) ++(.3333em, .3333em) coordinate (bbll)
(bbeast |- bbnorth) ++(-.3333em, -.3333em) coordinate (bbur)
\pgfextra{\pgfresetboundingbox}
[use as bounding box]
(bbll) (bbur)
;
\end{tikzpicture}
\end{document}