如何使 TikZ 自动机居中?

如何使 TikZ 自动机居中?

我有以下自动机代码,如何将其放在页面中心(水平)?

\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}

更新:

如果你只想要水平居中,使用\centeringcenter。以下代码显示了如何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}

相关内容