如何制作一个大小和节点距离为零的节点,使得位于其右侧的节点位于同一位置?
我对节点绘制循环中第一个节点的解决方案是从一个不可见的节点开始,但我无法将其缩小。如果能有更好的解决方案,我也很高兴。
\documentclass{standalone}
\usepackage{intcalc}
\usepackage{tikz}
\begin{document}
\tikzstyle{frame} = [rectangle, draw, fill=blue!20,
text width=2em, text centered, minimum height=2em, node distance=1.5cm]
\begin{tikzpicture}
\node (f0) {}; % This one is too big
\foreach \framenum in {1,...,7}{
\def\frameangle{\intcalcMul{ \intcalcDec{\intcalcMod{\framenum}{3}} }{8}} % 0, 8, -8, ...
\def\lastframenum{\intcalcDec{\framenum}}
\node [frame, right of=f\lastframenum] (f\framenum)
{$f_\framenum$ $\frameangle^\circ$};
}
\end{tikzpicture}
\end{document}
编辑:结果如下\coordinate (f0) {}
:
答案1
您的代码存在某些问题:
第一个,正如杰克所指出的,您在应该使用坐标的地方使用了节点(这是一个无形状的节点,即只有一个点)。
然后,正如 TorbjørnT. 指出的那样,您在\tikzstyle
分配的末尾插入了一个虚假的空格。该\tikzstyle
宏早已弃用,应替换为更灵活的\tikzset
。但这对空格没有帮助。我建议您将所有全局分配移到序言中,这样您就不必处理空格了。如果此样式仅在文档中的此 TikZ 图片中使用,请将其声明移动到可选参数(或在通常不会创建空格的环境中\begin{tikzpicture}
使用):\tikzset
\begin{tikzpicture}[frame/.style={…, …}]
然后我们有right of
同样被弃用的语法。使用positioning
库和right=of <lastnode>
语法。
\foreach
如果您在循环内部检查是否有第一个节点,则甚至不需要这个辅助代码:
\ifnum\framenum=1
\node[frame] (f\framenum) {…};
\else
\node[frame, right=of f\lastframenum] (f\framenum) {…};
\fi
也不需要\intCalcDec
宏,您已经使用了循环remember
的选项\foreach
:
\foreach \framenum[remember=\framenum as \lastframenum] in {1,...,7}{
或者你也可以用 eTeX 进行计算\numexpr
:
\node [frame, right=of f\number\numexpr\framenum-1\relax] (f\framenum) {…};
请参阅参考文献 5 以获得关于该主题的简要概述。
虽然该intcalc
包无疑是一个很棒的包;但 PGF 内置了很多数学函数,我们可以在evaluate
循环选项中使用它们\foreach
:
\foreach \frameNum[
evaluate=\frameNum as \frameAngle using {int(8*(mod(\frameNum,3)-1))}
] in {1,...,7}
但是,当我们处于覆盖级别(意味着范围)时,TikZchains
库会为我们完成所有工作,然后将每个节点设置为这个,那么为什么要经历所有这些麻烦呢?start
chain
scope
tikzpicture
on
chain
如果没有frame
样式定义,这几乎就变成了一行:
\begin{tikzpicture}[start chain]
\foreach \frameNum[
evaluate=\frameNum as \frameAngle using {int(8*(mod(\frameNum,3)-1))}
] in {1,...,7}
\node [frame, on chain] (f\frameNum){$f_\frameNum$ $\frameAngle^\circ$};
\end{tikzpicture}
我还切换到minimum size
选项(设置minimum height
和minimum width
,并插入手动换行符。
TorbjørnT. 还检测到节点的高度并不总是相同的,事实上减号似乎为最后一行添加了深度。我们可以通过设置为text depth
来覆盖它0pt
,这将仅适用于最后一行。对于其他情况,您可以使用\smash
宏和/或(由amsmath
包提供的)b
选项:$\smash[b]{\frameAngle^\circ}$
。
参考
- 行末百分号(%)有什么用?
- 应该使用 \tikzset 还是 \tikzstyle 来定义 TikZ 样式?
- PGF/TikZ 中“right of=”和“right=of”之间的区别
- 程序包 PGF 数学错误:未知运算符“o”或“of”(这是图书馆的概览
positioning
) - 如何减少 tikz foreach 循环中的计数器
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{chains,positioning}
\tikzset{
frame/.style={
rectangle,
draw,
fill=blue!20,
align=center,
minimum size=2\baselineskip,
node distance=0.5cm
}
}
\begin{document}
\begin{tikzpicture}[start chain]
\foreach \frameNum[
evaluate=\frameNum as \frameAngle using {int(8*(mod(\frameNum,3)-1))}
] in {1,...,7}
\node [frame, text depth=+0pt, on chain] (f\frameNum){$f_\frameNum$\\$\frameAngle^\circ$};
\end{tikzpicture}
\end{document}