图库中的 pgfmath 给出编译错误

图库中的 pgfmath 给出编译错误

我想表示一个图,其中每个节点的标签都是通过模数计算获得的。第一个也是最简单的方法如下:

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphs.standard}

\begin{document}
\begin{tikzpicture}
    \def \n {3}
    \graph[clockwise=\n,radius=3cm] {
        \foreach \x [evaluate=\x as \xn using {int(mod(\x+1,\n))}] in {0,...,\the\numexpr\n-1} {
            \foreach \y [evaluate=\y as \yn using {int(mod(\y+1,\n))}] in {\x,...,\the\numexpr\n-1} {
                \x / {$a_\x, a_\xn$} --
                \y / {$a_\y, a_\yn$};
            };
        };
    };
\end{tikzpicture}

\end{document}

在此处输入图片描述

然后我发现了pgfmathtruncatemacro并写了

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphs.standard}

\begin{document}
\begin{tikzpicture}
    \def \n {3}
    \graph[clockwise=\n,radius=3cm] {
        \foreach \x in {0,...,\the\numexpr\n-1} {
            \pgfmathtruncatemacro{\xn}{mod(\x+1,\n)}%
            \foreach \y in {\x,...,\the\numexpr\n-1} {
                \pgfmathtruncatemacro{\yn}{mod(\y+1,\n)}%
                \x / {$a_\x, a_\xn$} --
                \y / {$a_\y, a_\yn$};
            };
        };
    };
\end{tikzpicture}

\end{document}

奇怪的是,它给了我这些错误:

! 未定义的控制序列。\pgfmathsetcount ... \pgfmath@onquick #2\pgfmath@ {\afterassignment \pgfmath... l.16 } ; 错误消息顶行末尾的控制序列从未被 \def'ed。如果您拼错了它(例如, \hobx'), typeI' 和正确的拼写(例如,`I\hbox')。否则继续,我会忘记未定义的内容。

! 未定义的控制序列。\tikz@lib@graph@handle@node@cont ...kzgraphnodeas\tikzgraphnodeas@default ... l.16 } ; 错误消息顶行末尾的控制序列从未被 \def'ed。如果您拼错了它(例如, \hobx'), typeI' 和正确的拼写(例如,`I\hbox')。否则继续,我会忘记未定义的内容。

! 未定义的控制序列。\tikz@lib@graph@typesetter ->\tikzgraphnodetext l.16 } ; 错误消息顶行末尾的控制序列从未被 \def 过。如果您拼错了它(例如, \hobx'), typeI' 和正确的拼写(例如,`I\hbox')。否则继续,我会忘记未定义的内容。

) ! 不完整 \iffalse;第 16 行之后的所有文本均被忽略。\fi

我真的不明白为什么它不起作用。

[编辑] 我根据此编写了第二段代码回答。我在 Overleaf 中写的部分是\n - 1不需要\the\numexpr的,所以这不是这里的问题。我不想\pgfmathtruncatemacro在节点的标签中包含它,因为我链接的答案对我来说也很好用,不需要它。我的问题是它在环境中使用它时看起来有缺陷\graph

[编辑 2] 添加它,\the\numexpr因为它不会在 TL 的每个安装上进行编译,并且不是这个原因导致程序无法运行。

答案1

\graph改变了语法:您不能直接使用 TeX 代码。您可以使用该/utils/exec键来执行一些任意的 TeX 代码。

这是 TeXLive 2018 最终版本的解决方案(Overleaf 使用,参见TeX Live 升级 2019 年 9 月):

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphs.standard}
\begin{document}
\begin{tikzpicture}
    \def \n {3}
    \graph[clockwise=\n,radius=3cm] {
        \foreach \x in {0,...,\n-1} {
            [/utils/exec={\pgfmathtruncatemacro{\xn}{mod(\x+1,\n)}}]%
            \foreach \y in {\x,...,\n-1} {
                [/utils/exec={\pgfmathtruncatemacro{\yn}{mod(\y+1,\n)}}]%
                \x / {$a_\x, a_\xn$} --
                \y / {$a_\y, a_\yn$};
            };
        };
    };
\end{tikzpicture}
\end{document}

以下是 TeXLive 2019 的解决方案:

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphs.standard}
\begin{document}
\begin{tikzpicture}
  \def\n{3}
  \graph[clockwise=\n,radius=3cm] {
    \foreach[parse=true] \x in {0,...,\n-1} {
      [/utils/exec={\pgfmathtruncatemacro{\xn}{mod(\x+1,\n)}}]
      \foreach[parse=true] \y in {\x,...,\n-1} {
        [/utils/exec={\pgfmathtruncatemacro{\yn}{mod(\y+1,\n)}}]
        \x / {$a_\x, a_\xn$} --
        \y / {$a_\y, a_\yn$};
      }
    }
  };
\end{tikzpicture}
\end{document}

以下是使用 TeXLive 2019\pgfmathsetmacro进行计算的解决方案\xmax(没有该parse选项,但仍然不能很好地工作):

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphs.standard}
\begin{document}
\begin{tikzpicture}
  \def\n{3}
  \graph[clockwise=\n,radius=3cm] {
    [/utils/exec={\pgfmathsetmacro\xmax{int(\n-1)}}]
    \foreach \x in {0,...,\xmax} {
      [/utils/exec={\pgfmathtruncatemacro{\xn}{mod(\x+1,\n)}}]
      \foreach \y in {\x,...,\xmax} {
        [/utils/exec={\pgfmathtruncatemacro{\yn}{mod(\y+1,\n)}}]
        \x / {$a_\x, a_\xn$} --
        \y / {$a_\y, a_\yn$};
      }
    }
  };
\end{tikzpicture}
\end{document}

答案2

这是您的第一个示例的可编译版本。我认为使用它没有任何好处,因为如果您想在路径中使用它,\pgfmathtruncatemacro您还必须将其包装到等等中。\pgfextra

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphs.standard}

\begin{document}
\begin{tikzpicture}
    \def \n {3}
    \graph[clockwise=\n,radius=3cm] {
        \foreach \x [evaluate=\x as \xn using {int(mod(\x+1,\n))}] in
        {0,...,\the\numexpr\n-1} {
            \foreach \y [evaluate=\y as \yn using {int(mod(\y+1,\n))}] in
            {\x,...,\the\numexpr\n-1} {
                \x / {$a_\x, a_\xn$} --
                \y / {$a_\y, a_\yn$}
            }
        }
    };
\end{tikzpicture}

\end{document}

这里有一个\pgfmathtruncatemacro使用版本。幸运的是,在这个应用程序中,结果不需要用于路径,而只需要用于排版。所以你可以\pgfmathtruncatemacro只添加你想要排版的内容。

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphs.standard}

\begin{document}
\begin{tikzpicture}
    \def \n {3}
    \graph[clockwise=\n,radius=3cm] {
        \foreach \x  in {0,...,\the\numexpr\n-1} {
            \foreach \y in {\x,...,\the\numexpr\n-1} {               
                \x / {$\pgfmathtruncatemacro{\xn}{int(mod(\x+1,\n))}a_\x, a_\xn$} --
                \y / {$\pgfmathtruncatemacro{\yn}{int(mod(\y+1,\n))}a_\y, a_\yn$}
            }
        }
    };
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容