如何告诉 TikZ 先计算然后显示一个变量?

如何告诉 TikZ 先计算然后显示一个变量?

我想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,可以使用evaluatecount键。在解释操作时,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 太聪明了!

相关内容