逻辑关系中的自动机

逻辑关系中的自动机

我正在尝试编写一个涉及 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}

然而,仍有一些值得担忧的地方:

  1. 您不应该使用\def,尤其是与非常短的宏名结合使用。
  2. 您不应该使用单字母宏。
  3. 由于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}

在此处输入图片描述

相关内容