更新

更新

考虑以下 MWE:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs}
\begin{document}
  \tikz \graph [nodes={empty nodes, fill, circle, inner sep=1pt, draw}]{
      \foreach \i in {1,...,5} { a --[bend left={2*90/5-(\i-1)*90/5}] b; }
    };
\end{document}

图形

结果看起来相当优雅,但我实际上希望边的inout角度相等。现在看来,对于所有边,尽管PGF 手册中in=180的描述指出/tikz/bend left=<angle>

此选项设置out=<angle>,in=180-<angle>,relative。如果没有给出,则使用<angle> 最后给出的bend left或角度。bend right

我做错了什么?

答案1

bend left定义如下

\tikzoption{bend left}[]{%
  \def\pgf@temp{#1}%
  \ifx\pgf@temp\pgfutil@empty%
  \else%
    \def\tikz@to@bend{#1}%
  \fi%
  \let\tikz@to@out=\tikz@to@bend%
  \c@pgf@counta=180\relax%
  \advance\c@pgf@counta by-\tikz@to@out\relax%
  \edef\tikz@to@in{\the\c@pgf@counta}%
  \tikz@to@switch@on%
  \tikz@to@relativetrue%
}

正如你所见,TiZ 使用 TeX 算法来计算因子in。因此您不能将数学表达式传递给它。

相反,你应该自己做算术,例如以下

  \tikz \graph [nodes={empty nodes, fill, circle, inner sep=1pt, draw}]{
      \foreach \i in {1,...,5} {
          a --[
              /utils/exec={\pgfmathsetmacro\bendangle{2*90/5-(\i-1)*90/5}},
              bend left=\bendangle
          ] b; }
    };

更新

@Ignasi 建议如下

\foreach \i [evaluate=\i as \bendangle using {2*90/5-(\i-1)*90/5}] in {1,...,5}
    { a--[bend left=\bendangle] b;}

然后我发现了以下作品

\foreach \i [evaluate={\bendangle=2*90/5-(\i-1)*90/5;}] in {1,...,5}
    { a--[bend left=\bendangle] b;}

如果有\usetikzlibrary{math},那么以下内容也有效

  \foreach \i in {1,...,5} {
      a --[
          evaluate={\bendangle=2*90/5-(\i-1)*90/5;},
          bend left=\bendangle
      ] b; }

对于第一种情况,密钥由/pgf/foreach/evaluate和处理\pgffor@assign@@parse@old

对于第二种情况,密钥由/pgf/foreach/evaluate和处理\pgffor@assign@@parse

对于第三种情况,密钥由/tikz/evaluate和 然后处理\tikz@math

相关内容