我正在尝试编写一个涉及 2 个自动机的逻辑表达式,如附图所示。但我收到以下错误消息:
\a 的使用与其定义不符
\documentclass[12pt]{book}
\usepackage[paperwidth=16cm, paperheight=24cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{tikz}
\usetikzlibrary{arrows,automata,matrix,positioning}
\begin{document}
\begin{figure}
\centering
\def\a1
{%
\begin{tikzpicture}[>=stealth', shorten >=1pt, auto, node distance=1cm]
\node[initial, state](1){1};
\node[state](2)[right=of 1]{2};
\node[state, accepting](3)[right=of 2]{3};
\path[->] (1) edge node {$a$} (2);
\path[->] (2) edge node {$b$} (3);
\end{tikzpicture}
}
\def\a2
{%
\begin{tikzpicture}[>=stealth', shorten >=1pt, auto, node distance=1cm]
\node[initial, state](1){1};
\node[state, accepting](3)[right=of 1]{3};
\path[->] (1) edge node {$a$} (2);
\path[->] (2) edge node {$b$} (3);
\end{tikzpicture}
}
\a1 $\implies$ \a2
\end{figure}
\end{document}
答案1
Steven 说这\a1
不是一个有效的宏名,这当然是对的。你可以按如下方式使其有效:
\documentclass[border=3mm]{standalone}
\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{arrows,automata,matrix,positioning}
\begin{document}
\def\a#1{\ifcase#1\or
\begin{tikzpicture}[>=stealth', shorten >=1pt, auto, node distance=1cm]
\node[initial, state](1){1};
\node[state](2)[right=of 1]{2};
\node[state, accepting](3)[right=of 2]{3};
\path[->] (1) edge node {$a$} (2);
\path[->] (2) edge node {$b$} (3);
\end{tikzpicture}
\or
\begin{tikzpicture}[>=stealth', shorten >=1pt, auto, node distance=1cm]
\node[initial, state](1){1};
\node[state, accepting](3)[right=of 1]{3};
\path[->] (1) edge node {$ab$} (3);
\end{tikzpicture}
\fi}
$\vcenter{\hbox{\a1}}\implies\vcenter{\hbox{\a2}}$
\end{document}
然而,仍有一些值得担忧的地方:
- 您不应该使用
\def
,尤其是与非常短的宏名结合使用。 - 您不应该使用单字母宏。
- 由于
arrows
已被弃用,您可能想要切换到arrows.meta
。
所以你可以做这样的事情:
\documentclass[border=3mm]{standalone}
\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{arrows.meta,automata,matrix,positioning}
\begin{document}
\newcommand\mypic[1]{\vcenter{\hbox{
\begin{tikzpicture}[>=Stealth, shorten >=1pt, auto, node distance=1cm]
\node[initial, state](1){1};
\ifcase#1\or
\node[state](2)[right=of 1]{2};
\node[state, accepting](3)[right=of 2]{3};
\path[->] (1) edge node {$a$} (2);
\path[->] (2) edge node {$b$} (3);
\or
\node[state, accepting](3)[right=of 1]{3};
\path[->] (1) edge node {$ab$} (3);
\fi
\end{tikzpicture}}}}
$\mypic1\implies\mypic2$
\end{document}
如您所见,这也使您避免了不必要的重复。
答案2
您的代码存在一些问题,包括内容太宽,超出边距,以及垂直对齐效果不佳。但最大的问题在于误解了宏的命名规则。
\a1
和\a2
不是有效的宏名。虽然非字母字符可以成为控制序列名称的一部分,但如果您使用正确的csname
约定,则只能使用字母字符(或更准确地说,只有\catcode
= 11 个标记),只需在名称前面添加 catcode 0 反斜杠即可。因此,\aA
是有效的宏名,\a1
不是。
如果您确实希望宏名称中包含数字,则需要\expandafter\def\csname a1\endcsname{...}
,然后使用 调用它。但是\csname a1\endcsname
,直接调用它会更容易,例如,正如我在下面的 MWE 中所做的那样。\aA
\aB
\documentclass[12pt]{book}
\usepackage[paperwidth=16cm, paperheight=24cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{tikz,amsmath}
\usetikzlibrary{arrows,automata,matrix,positioning}
\begin{document}
\begin{figure}
\centering
\def\aA
{%
\begin{tikzpicture}[>=stealth', shorten >=1pt, auto, node distance=1cm]
\node[initial, state](1){1};
\node[state](2)[right=of 1]{2};
\node[state, accepting](3)[right=of 2]{3};
\path[->] (1) edge node {$a$} (2);
\path[->] (2) edge node {$b$} (3);
\end{tikzpicture}
}
\def\aB
{%
\begin{tikzpicture}[>=stealth', shorten >=1pt, auto, node distance=1cm]
\node[initial, state](1){1};
\node[state, accepting](3)[right=of 1]{3};
\path[->] (1) edge node {$ab$} (3);
\end{tikzpicture}
}
\makebox[0pt]
{\aA \raisebox{12pt}{$\implies$} \aB}
\end{figure}
\end{document}