LaTeXによる有限ステートマシン(FSM)の状態遷移図

APDahlen Applications Engineer

状態遷移図は、ステートマシンを表現する便利な方法です。残念なことに、その作成は困難です。視覚的にわかりやすいスケッチを描くには、かなりの時間がかかります。

1つの解決策は、LaTex組版プログラムを使用することです。ある意味では、 \LaTeX は使い慣れたワープロのようなものです。違いは、組版の書式をテキストで記述することです。また、すべてのオリジナル文書は「.txt」または「.tex」ファイルに記述します。これらが完了すると、LaTeXの「コンパイラ」を使って、通常は「.pdf」文書の形で出力されます。ある面では、htmlを使ってウェブページを開発するようなものです。

\LaTeX のすばらしさは、プログラマーが利用できるあらゆる書式や手法を駆使して、複雑な文書をつなぎ合わせることができる点にあります。また、ベースとなるプレーンテキスト文書の実用性と自由な特質についても言及すべきことがあります。

Tikzのような \LaTeX のパッケージは、図1や図2に示すような典型的な結果である状態遷移図を比較的簡単に生成します。これに関連するコードは、この記事の最後に添付されています。これらの状態遷移図はTeXworksを使って作成されたものです。

技術的なヒント: このTechForumは \LaTeX を限定的にサポートしています。これは特に数学の方程式を表示するのに便利です。例えば、オームの法則はR = \dfrac{E}{I}と書かれ、それを2つの$記号の間に置くと以下のようになります。
R = \dfrac{E}{I}

残念ながら、 \LaTeX の習得には厳しいものがあります。したがって、この短い記事でそのプロセスを説明することはしません。その代わりに、図1と図2を生成するために使用したコードが役に立つことを願って、コメントなしでこの記事に添付します。

ご健闘をお祈りします。

APDahlen

追伸:もし \LaTeX に興味があれば、オンラインチュートリアルを検索してください。また、生成されたテキストを見ることができるオンラインページもぜひ検索してみてください。

図1: リセットを備える単純なCAM動作のステートマシンの状態遷移図

図2: 複雑な状態遷移を有するマシンの状態遷移図


\documentclass{article}
 
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
 
	\usepackage{geometry}
 
	\geometry{
		letterpaper,
		% total={170mm,257mm},
		 left=0.5in,
		 right =0.5in,
		top=0.5in,
		bottom=0.75in
	 }
 
 
\begin{document}
 
 
\begin{tikzpicture} [state/.style=state with output, ->,>=stealth',shorten >=1pt,auto,node distance=5.0cm, semithick]
 
\tikzstyle{every state}=[fill=blue!20,draw=black,text=black]
 
	\node[initial,state]	(1) 						{$Idle$ \nodepart{lower} 	$0000001$};
	\node[state]			(2) [above right of = 1]	{$Alarm$ \nodepart{lower} 	$0010010$};
	\node[state]			(3) [right of = 2]			{$Forward$ \nodepart{lower} $1000110$};
	\node[state]			(4) [below right of = 3]	{$Delay$ \nodepart{lower} 	$0001010$};
	\node[state]			(5) [below left of = 4]		{$Alarm$ \nodepart{lower} 	$0010010$};
	\node[state]			(6) [left of = 5]			{$Reverse$ \nodepart{lower} $0100110$};
 
	\path	(1)	edge	[sloped, anchor=center, above, in=205, out= 65]			node {Cycle PB}		(2)
 
			(2) edge	[sloped, anchor=center, above, in=160, out= 20]			node {Done}			(3)
				edge	[sloped, anchor=center, below, in=20, out=-110]			node {$Reset$}		(1)
 
			(3) edge	[sloped, anchor=center, above, in=110, out=-20]			node {5 seconds}	(4)
				edge	[sloped, anchor=center, below, in=10, out=-135]			node {$Reset$}		(1)
 
			(4) edge	[sloped, anchor=center, below , in=20, out=-110]		node {$3 seconds$}	(5)
				edge	[sloped, anchor=center, below, in=-10, out=200]			node {$Reset$}		(1)
 
			(5) edge 	[sloped, anchor=center, below, in=-20, out=200]			node {Done}			(6)
				edge	[sloped, anchor=center, below, in=-20, out=160]			node {$Reset$}		(1)
 
			(6) edge 	[sloped, anchor=center, below, in=-70, out=155]			node {5 seconds}	(1)
				edge	[sloped, anchor=center, below, in=-30, out=110]			node {$Reset$}		(1)
 
		; % Don't forget this semicolon
 
\end{tikzpicture}
 
 
\newpage
 
 
\begin{tikzpicture} [state/.style=state with output, ->,>=stealth',shorten >=1pt,auto,node distance=5.0cm, semithick]
 
\tikzstyle{every state}=[fill=blue!20,draw=black,text=black]
 
	\node[initial,state]	(1) 						{$1$ \nodepart{lower} $Retracting$};
	\node[state]			(2) [above right of=1]		{$2$ \nodepart{lower} $Retracted$};
	\node[state]			(3) [below right of=2]		{$3$ \nodepart{lower} $Extending$};
	\node[state]			(4) [below left of=3]		{$4$ \nodepart{lower} $Extended$};
	\node[state]			(5) [below of=4]			{$5$ \nodepart{lower} $Fault$};
 
	\path	(1)	edge	[sloped, anchor=center, above]										node {xSenRet}				(2)
				edge	[sloped, anchor=center, below, in=200, out=-20]						node {$xEN$}				(3)
				edge	[sloped, anchor=center, below, bend right]							node {t $>$ timeMove}		(5)
 
			(2) edge	[sloped, anchor=center, above]										node {xEn}					(3)
				edge	[sloped, anchor=center, below, min distance=7cm, in=10, out=-10]	node {$\overline{xSenRet}$}	(5)
 
			(3) edge	[sloped, anchor=center, above]										node {xSenExt}				(4)
				edge	[sloped, anchor=center, above, in=20, out=160]						node {$\overline{xEN}$}		(1)
				edge	[sloped, anchor=center, below, bend left]							node {t $>$ timeMove}		(5)
 
			(4) edge	[sloped, anchor=center, above]										node {$\overline{xEN}$}		(1)
				edge	[sloped, anchor=center, below]										node {$\overline{xSenExt}$}	(5)
 
			(5) edge    [sloped, anchor=center, below, min distance=2.5cm, in=230, out=170]	node {xReset}				(1)
 
	; % Don't forget this semicolon
 
\end{tikzpicture}
 
 
\end{document}




オリジナル・ソース(English)