我正在探索 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
类不适合像我们这样的凡人。它更像是技术人员的测试环境(好吧,我在这里真的很近似),相反,您可以使用article
或standalone
。
一、扩容、分组等解决方案
\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
。