我有一段代码在 Ubuntu 18.04 中编译得很好。我升级到了 Ubuntu 20.04,但同样的代码无法再编译,而在 18.04 中仍然可以编译。在两个发行版中,我都安装了官方的 texlive 和相同的 TeX 相关软件包。
以下是代码:
\documentclass{standalone}
\usepackage{tikz}
\newcommand{\cycle}[1]{%
\begin{tikzpicture}[baseline]
\foreach[count=\n] \v in {#1}; % count the number of elements
\pgfmathsetmacro{\r}{\n*0.2} % set the node distance from (0,0)
\pgfmathsetmacro{\b}{120/\n} % evaluate the bend angle
\foreach[count=\i, evaluate=\i as \a using (\i-1)*360/\n ] \v in {#1}
\node [circle, draw, font=\scriptsize,inner sep=2pt] (\i) at (\a:\r) {$\v$};
\foreach \i [remember=\i as \j (initially \n)] in {1,...,\n}
\draw[semithick,-stealth] (\j) to [bend right=\b] (\i);
\end{tikzpicture}
}
\begin{document}
\cycle{1,2,3,4,5}
\end{document}
Ubuntu 20.04 中的错误如下:
! Undefined control sequence.
<argument> \n
*0.2
l.18 \cycle{1,2,3,4,5}
?
答案1
问题出在这一行:
\foreach[count=\n] \v in {#1}; % count the number of elements
我认为 tikz 从未承诺过会记住这样的变量,我记得最近的一个变化破坏了这种行为。如果你想记住的值,\n
那么你需要使用类似的东西:
\foreach[count=\c] \v in {#1} {\xdef\n{\c}}%
请注意,您需要使用,\xdef
因为\foreach
循环发生在 TeX 组内。
就我个人而言,我更喜欢多加几个括号,因此我会将代码写成这样:
\documentclass[tikz, border=2mm]{standalone}
\newcommand{\cycle}[1]{%
\begin{tikzpicture}[baseline,scale=3]
\foreach[count=\c] \v in {#1} {\xdef\n{\c}}% count the number of elements
\pgfmathsetmacro{\r}{\n*0.2} % set the node distance from (0,0)
\pgfmathsetmacro{\b}{120/\n} % evaluate the bend angle
\foreach[count=\i, evaluate=\i as \a using (\i-1)*360/\n ] \v in {#1} {
\node [circle, draw, font=\scriptsize,inner sep=2pt] (\i) at (\a:\r) {$\v$};
}
\foreach \i [remember=\i as \j (initially \n)] in {1,...,\n}
\draw[semithick,-stealth] (\j) to [bend right=\b] (\i);
\end{tikzpicture}
}
\begin{document}
\cycle{1,2,3,4,5}
\end{document}
无论如何,这都会产生您想要的输出: