从 Ubuntu 18.04 升级到 Ubuntu 20.04 后,以前可以编译的 Tikz 代码无法再编译

从 Ubuntu 18.04 升级到 Ubuntu 20.04 后,以前可以编译的 Tikz 代码无法再编译

我有一段代码在 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}

输出(在 18.04... 获得)如下: 在此处输入图片描述

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}

无论如何,这都会产生您想要的输出:

在此处输入图片描述

相关内容