![如何使 TikZ 自动机居中?](https://linux22.com/image/350327/%E5%A6%82%E4%BD%95%E4%BD%BF%20TikZ%20%E8%87%AA%E5%8A%A8%E6%9C%BA%E5%B1%85%E4%B8%AD%EF%BC%9F.png)
我有以下自动机代码,如何将其放在页面中心(水平)?
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\centering
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=white,draw=black,text=black]
\node[initial,state] (0) {$q_0$};
\node[state,accepting] (1) [right of=0] {$q_1$};
\path (0) edge [loop above] node {a} (0)
edge [bend left] node {b} (1)
(1) edge [loop above] node {a} (1)
edge [bend left] node {b} (0);
\end{tikzpicture}
\end{document}
答案1
使用\begin{center}/\end{center}
图形水平居中,如下例所示:
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz,lipsum}
\usetikzlibrary{arrows,automata}
\begin{document}
\lipsum[1]
\begin{center}
\fbox{
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=white,draw=black,text=black]
\node[initial,state] (0) {$q_0$};
\node[state,accepting] (1) [right of=0] {$q_1$};
\path (0) edge [loop above] node {a} (0)
edge [bend left] node {b} (1)
(1) edge [loop above] node {a} (1)
edge [bend left] node {b} (0);
\end{tikzpicture}
}
\end{center}
\lipsum[2]
\end{document}
我在 tikz 图片周围添加了一个框架,以便清楚地看到框架是居中。但是,如果没有框架,图片看起来会错位,因为您可能预计图形会居中,而不考虑“开始”标签。即,$b$ 标签应该居中,对吗?
您可以通过告诉 tikz 图形的哪一部分必须被视为边界框的一部分来实现这一点。此边界框定义图形的宽度,边界框之外的所有内容都将与周围环境“重叠”。
这是一个可能的解决方案:
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz,lipsum}
\usetikzlibrary{arrows,automata,calc}
\begin{document}
\lipsum[1]
\begin{center}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\path[use as bounding box] (0,-1) rectangle(3,1.5);
\tikzstyle{every state}=[fill=white,draw=black,text=black]
\node[initial,state] (0) {$q_0$};
\node[state,accepting] (1) [right of=0] {$q_1$};
\path (0) edge [loop above] node {a} (0)
edge [bend left] node {b} (1)
(1) edge [loop above] node {a} (1)
edge [bend left] node {b} (0);
\end{tikzpicture}
\end{center}
\lipsum[2]
\end{document}
但是,此解决方案并不令人满意,因为边界框是在“绝对”坐标中定义的,这是通过反复试验找到的。更好的解决方案是根据节点 (0) 和 (1) 的坐标定义边界框,但这在绘制这些节点之前是不可能的,在这种情况下,它还会(自动)绘制“开始”标签,这是一个问题,因为应该在边界框外绘制任何内容之前定义边界框。
答案2
我知道你想让图表垂直居中:
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\centering
~\vfill
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=white,draw=black,text=black]
\node[initial,state] (0) {$q_0$};
\node[state,accepting] (1) [right of=0] {$q_1$};
\path (0) edge [loop above] node {a} (0)
edge [bend left] node {b} (1)
(1) edge [loop above] node {a} (1)
edge [bend left] node {b} (0);
\end{tikzpicture}
\vfill
\end{document}
更新:
如果你只想要水平居中,使用\centering
或center
。以下代码显示了如何center
引入比 更大的垂直空间\centering
。
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\usepackage{lipsum}
\begin{document}
\lipsum[2]
{\par\centering
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=white,draw=black,text=black]
\node[initial,state] (0) {$q_0$};
\node[state,accepting] (1) [right of=0] {$q_1$};
\path (0) edge [loop above] node {a} (0)
edge [bend left] node {b} (1)
(1) edge [loop above] node {a} (1)
edge [bend left] node {b} (0);
\end{tikzpicture}
\par}
\lipsum[2]
\begin{center}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=white,draw=black,text=black]
\node[initial,state] (0) {$q_0$};
\node[state,accepting] (1) [right of=0] {$q_1$};
\path (0) edge [loop above] node {a} (0)
edge [bend left] node {b} (1)
(1) edge [loop above] node {a} (1)
edge [bend left] node {b} (0);
\end{tikzpicture}
\end{center}
\lipsum[2]
\end{document}
答案3
如果您在图片前后放置一些文字,您的问题可能会得到更好的显示。
您可以使用\begin{center} ... \end{center}
。
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
ciao
\begin{center}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=white,draw=black,text=black]
\node[initial,state] (0) {$q_0$};
\node[state,accepting] (1) [right of=0] {$q_1$};
\path (0) edge [loop above] node {a} (0)
edge [bend left] node {b} (1)
(1) edge [loop above] node {a} (1)
edge [bend left] node {b} (0);
\end{tikzpicture}
\end{center}
ciao
\end{document}