节点之间的 Tikz foreach 路径从错误的位置开始

节点之间的 Tikz foreach 路径从错误的位置开始

这张照片

在此处输入图片描述

已通过以下代码生成。红色圆圈中的边的起点/终点不在节点的正确一侧。

\documentclass[tikz]{standalone}

% ==================================================
% GENREAL OBLIQUE CRYSTALLOGRAPHIC COORDINATE SYSTEM
% ==================================================
\makeatletter 
\tikzdeclarecoordinatesystem{general}
{%
  {%
    \pgf@xa=0pt% point
    \pgf@ya=0pt%
    \pgf@xb=0pt% sum
    \tikz@bary@dolist#1,=,%
    \pgfmathparse{1}%
    % modified from copy
    % /usr/local/texlive/2018/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
    \global\pgf@x=\pgfmathresult\pgf@xa%
    \global\pgf@y=\pgfmathresult\pgf@ya%
  }%
}%
\makeatother 

\begin{document}
\begin{tikzpicture}

    \coordinate (A) at (0,-2);
    \coordinate (B) at (3,0);

    \path foreach \na in {0,...,2} { foreach \nb in {0,...,2} {
    % Wyckoff letter 'a'
      (general cs:A=\na,B=\nb)
        node (a\na\nb) {2}
        % node     {a}
        node[yshift=0.5cm] {a\na\nb}
    % Wyckoff letter 'b'
      \ifnum \nb<2
       (general cs:A=\na,B=\nb+0.5)
       node (b\na\nb) {2}
        % node {b}
        node[yshift=0.5cm] {b\na\nb}
      \fi
    }
    };

    % PROBLEM
    \foreach \nb [evaluate=\nb as \nbnext using \nb+1] in {0,...,2} {
      \ifnum \nb<2
        \draw (a0\nb) -- (b0\nb) -- (a0\nbnext);
      \fi
    };

    % NO PROBLEM:
    % \draw (a00) -- (b00) -- (a01);
    % \draw (a01) -- (b01) -- (a02);

\end{tikzpicture}
\end{document}

我使用注释掉的代码是没有问题的

\draw (a00) -- (b00) -- (a01);
\draw (a01) -- (b01) -- (a02);

在此处输入图片描述

我认为我的 foreach 循环产生的代码与我手动编写的代码完全相同,而我对 tikz 在这里遇到的困难感到非常惊讶。

根据薛定谔的猫的回答进行更新

正如指出的那样,简单的整数运算仍然会产生一个固定的点宽度数字,例如1+1=2.0。例如,这在第 95.3.1 节中隐式显示基本算术函数pgf/tikz 文档 v3.1.5b 版:

81.0\pgfmathparse{add(75,6)} \pgfmathresult

可以通过打印a0\nbext为节点的内容来验证。

在这种情况下,这会产生被解释为锚点规范的后果.0。 pgf/tikz 文档(第 17.2.1 节“节点命令的语法”)已经指出,句点不应出现在节点名称中:

为节点分配一个名称以供以后参考。由于这是一个“高级”名称(驾驶员永远不会知道它),因此在命名节点时,您可以使用空格、数字、字母或任何您喜欢的名称。因此,您可以将节点命名为 1 或图表开头,甚至y_1。您的节点名称不应该包含任何标点符号,如点、逗号或冒号,因为它们用于检测引用节点时所指的坐标类型。

相关问题:

答案1

通常的问题是,如果你没有明确说明你想要整数,TiZ 添加.0,它被解释为锚点,east在本例中是锚点。我所做的就是替换

[evaluate=\nb as \nbnext using \nb+1]

经过

[evaluate=\nb as \nbnext using {int(\nb+1)}] 

获得

\documentclass[tikz]{standalone}

% ==================================================
% GENREAL OBLIQUE CRYSTALLOGRAPHIC COORDINATE SYSTEM
% ==================================================
\makeatletter 
\tikzdeclarecoordinatesystem{general}
{%
  {%
    \pgf@xa=0pt% point
    \pgf@ya=0pt%
    \pgf@xb=0pt% sum
    \tikz@bary@dolist#1,=,%
    \pgfmathparse{1}%
    % modified from copy
    % /usr/local/texlive/2018/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
    \global\pgf@x=\pgfmathresult\pgf@xa%
    \global\pgf@y=\pgfmathresult\pgf@ya%
  }%
}%
\makeatother 

\begin{document}
\begin{tikzpicture}

    \coordinate (A) at (0,-2);
    \coordinate (B) at (3,0);

    \path foreach \na in {0,...,2} { foreach \nb in {0,...,2} {
    % Wyckoff letter 'a'
      (general cs:A=\na,B=\nb)
        node (a\na\nb) {2}
        % node     {a}
        node[yshift=0.5cm] {a\na\nb}
    % Wyckoff letter 'b'
      \ifnum \nb<2
       (general cs:A=\na,B=\nb+0.5)
       node (b\na\nb) {2}
        % node {b}
        node[yshift=0.5cm] {b\na\nb}
      \fi
    }
    };

    % PROBLEM
    \foreach \nb [evaluate=\nb as \nbnext using {int(\nb+1)}] in {0,...,2} {
      \ifnum \nb<2
        \draw (a0\nb) -- (b0\nb) -- (a0\nbnext);
      \fi
    };

    % NO PROBLEM:
    % \draw (a00) -- (b00) -- (a01);
    % \draw (a01) -- (b01) -- (a02);

\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容