我想表示一个图,其中每个节点的标签都是通过模数计算获得的。第一个也是最简单的方法如下:
\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'), type
I' 和正确的拼写(例如,`I\hbox')。否则继续,我会忘记未定义的内容。! 未定义的控制序列。\tikz@lib@graph@handle@node@cont ...kzgraphnodeas\tikzgraphnodeas@default ... l.16 } ; 错误消息顶行末尾的控制序列从未被 \def'ed。如果您拼错了它(例如,
\hobx'), type
I' 和正确的拼写(例如,`I\hbox')。否则继续,我会忘记未定义的内容。! 未定义的控制序列。\tikz@lib@graph@typesetter ->\tikzgraphnodetext l.16 } ; 错误消息顶行末尾的控制序列从未被 \def 过。如果您拼错了它(例如,
\hobx'), type
I' 和正确的拼写(例如,`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}