TikZ 中的变量和其他基本编程概念

TikZ 中的变量和其他基本编程概念

我正在探索 TikZ。我用它来绘制一个相当复杂的自动机(大约 20 个状态)。我完全是手动完成的(即指定所有状态和所有连接)。虽然非常长而真的无聊,所以现在我尝试以正确的方式去做(即通过做一些循环)。

虽然我遇到了一个很大的问题:我想编程,但我不知道可以使用哪些常用工具(即变量之类的东西)。我确实了解 TeX 的基础知识,甚至开始阅读 TeX 书籍,但我还没有掌握它,仍然缺乏基础。

例如,我想循环遍历一个节点列表并将其链接到下一个节点。为此,我想记住我经过的最后一个节点,以便它可以作为我下一个链接的出发点(我试图提供 MWE,但我的实际自动机要大得多)。

我的尝试:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{arrows, automata}

\begin{document}
\begin{tikzpicture}

  \node[initial,state]    (A)                    {A};
  \node[state]            (B) [right of=A]       {B};
  \node[state]            (C) [right of=B]       {C};
  \node[state, accepting] (D) [right of=C]       {D};


  \newcommand\from{A}
  \foreach \to in {B, C, D}
  {
    \path (\from) edge [-] (\to);
    \renewcommand\from{\to};
  }
\end{tikzpicture}
\end{document}

我尝试用和\def代替,但无济于事。\newcommand\renewcommand

因此,我希望找到一个好的教程,让我能够掌握所有这些基本原理,因为 TikZ/pgf 手册很大,我找不到我需要的信息。我想学习的原理是 TikZ 编程的基础。

附言:我想我的问题肯定有人问过。但是我没有在研究结果中得到的问题中找到答案。

答案1

看上去没什么问题,但实际上你的问题与 TeX 组、扩展和全局/局部定义有关。因此,在这里解决这个问题确实相当广泛,远远超出了 TikZ 和 TeX 编程。

一些简短的评论:

  • \foreach在 TeX 组中运行。除其他特点外,定义仅在该组内有效,但在该组外消失。因此,在某种程度上,每个循环都会\foreach将变量重置为其原始设置。在您的示例中再次\from变为A
  • 您可以使用[remember=<foreach variable> as <another macro name]密钥将先前的值保留在内存中。因此,该定义不受组进入/退出问题的影响。
  • TikZ\foreach将其理解a,...,z,A,...,Z为重复数组。因此,在您的示例中,有一个简单的解决方法。
  • minimal类不适合像我们这样的凡人。它更像是技术人员的测试环境(好吧,我在这里真的很近似),相反,您可以使用articlestandalone

一、扩容、分组等解决方案

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows, automata}

\begin{document}
\begin{tikzpicture}

  \node[initial,state]    (A)                    {A};
  \node[state]            (B) [below right of=A]       {B};
  \node[state]            (C) [right of=B]       {C};
  \node[state, accepting] (D) [above right of=C]       {D};


  \newcommand\from{A}
  \foreach \too in {B, C, D}
  {
    \path (\from) edge [-] (\too);
    \xdef\from{\too}
  }
\end{tikzpicture}
\end{document}

在此处输入图片描述

归根结底是因为我的图片裁剪不当。下面是一个remember解决方案。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows, automata}

\begin{document}
\begin{tikzpicture}

  \node[initial,state]    (A)                    {A};
  \node[state]            (B) [below right of=A]       {B};
  \node[state]            (C) [right of=B]       {C};
  \node[state, accepting] (D) [above right of=C]       {D};

\foreach \x [remember=\x as \lastx (initially A)] in {B,...,D}{
% "initially" works only with ... I've recently found it but 
% didn't have time to report it.
    \path (\lastx) edge [-] (\x);
}
\end{tikzpicture}
\end{document}

您可能更愿意使用非现有 (La)TeX 宏的变量名。因此我将其改为\x

相关内容