这张照片
已通过以下代码生成。红色圆圈中的边的起点/终点不在节点的正确一侧。
\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
通常的问题是,如果你没有明确说明你想要整数,Ti钾Z 添加.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}