我想TikZ
先计算然后显示变量的值。问题是为了简单起见,基于这个具体的例子来自 TeXample.net:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\def \n {5}
\def \radius {3cm}
\def \margin {8} % margin in angles, depends on the radius
\foreach \s in {1,...,\n}
{
\node[draw, circle] at ({360/\n * (\s - 1)}:\radius) {$\s$};
\draw[->, >=latex] ({360/\n * (\s - 1)+\margin}:\radius)
arc ({360/\n * (\s - 1)+\margin}:{360/\n * (\s)-\margin}:\radius);
}
\end{tikzpicture}
\end{document}
假设我搞砸了,我想让我的标签从 0 到 n-1,而不是从 1 到 n。我该如何告诉 TikZ 首先计算变量的差异或任何操作,然后显示它:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\def \n {5}
\def \radius {3cm}
\def \margin {12} % margin in angles, depends on the radius
\foreach \s in {1,...,\n}
{
\node[draw, circle] at ({360/\n * (\s - 1)}:\radius) {$\s-1$};
\draw[->, >=latex] ({360/\n * (\s - 1)+\margin}:\radius)
arc ({360/\n * (\s - 1)+\margin}:{360/\n * (\s)-\margin}:\radius);
}
\end{tikzpicture}
\end{document}
我甚至使用了临时辅助变量 \r=\s-1,但它仍然打印以下内容,而不是节点的编号从 0 到 n-1:
备注:我知道该问题可以通过为 定义另一个范围来解决\s
,即{0,...,\n-1}
但我已经写了一个相似的代码(但很长,所以如果我发布它它就不是 MWE)基于此,依赖于\s
并且我不想\s+1
在某种较长的公式中多次移动变量。
答案1
要将对象从 0 编号到值 n-1,可以使用evaluate
或count
键。在解释操作时,pgfmanual 中对这两者进行了说明foreach
。后者的示例如下:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\def \n {5}
\def \radius {3cm}
\def \margin {12} % margin in angles, depends on the radius
\foreach \s[count=\xi from 0] in {1,...,\n}
{
\node[draw, circle] at ({360/\n * (\s - 1)}:\radius) {$\xi$};
\draw[->, >=latex] ({360/\n * (\s - 1)+\margin}:\radius)
arc ({360/\n * (\s - 1)+\margin}:{360/\n * (\s)-\margin}:\radius);
}
\end{tikzpicture}
\end{document}
结果:
答案2
补充 Claudio 的答案而无需额外的变量,对于不那么复杂的算术,您可以使用 eTeX,\numexpr
但为了使其在扩展方面在数学模式下工作,您需要\number
在它前面添加。
{$\number\numexpr\s-1\relax$};
pgfmath
对于剩余的部分,您可以通过引擎进行数学计算。
{\pgfmathparse{int(\s-1)}\pgfmathresult};
两者给出的结果与 Claudio 的答案相同。
答案3
只是为了和 PSTricks 一起玩。
\documentclass[pstricks,border=15pt,12pt]{standalone}
\usepackage{pst-node}
\degrees[5]
\psset{radius=12pt,arcsep=36pt,arrows=->}
\begin{document}
\begin{pspicture}[showgrid=false](-4,-4)(4,4)
\foreach \i in {1,2,...,5}{\rput(4;\the\numexpr\i-1){\Circlenode{N\i}{\the\numexpr\i-1}}}
\foreach \i in {1,2,...,5}{\psarc(0,0){4}{(N\i)}{(N\the\numexpr\i+1)}}
\end{pspicture}
\end{document}
笔记
考虑一下\foreach \i in {1,2,...,5}{\psarc(0,0){4}{(N\i)}{(N\the\numexpr\i+1)}}
。如果\i=5
不\psarc(0,0){4}{(N5)}{(N6)}
存在N6
,则不会产生错误。PSTricks 太聪明了!