![tikz/foreach:保护“迭代变量”后的空间](https://linux22.com/image/262011/tikz%2Fforeach%EF%BC%9A%E4%BF%9D%E6%8A%A4%E2%80%9C%E8%BF%AD%E4%BB%A3%E5%8F%98%E9%87%8F%E2%80%9D%E5%90%8E%E7%9A%84%E7%A9%BA%E9%97%B4.png)
我尝试在 tikz 中绘制一些节点,由于它们非常简单,所以我想使用命令来“缩短”它们\foreach
:
\foreach \xnum in {1,2,3,4,5}
{
\node at (X\xnum center) {$x_\xnum$};
}
您可以将其插入到任何tikzpicture
具有定义了一些节点 X1、X2、... 的环境的 MWE 中。(在我的情况下,这些是矩形,使用这个:https://tex.stackexchange.com/a/47797/22276)
问题在于,后面的空格\xnum
没有被保留,这就是为什么我在运行 pdflatex 时出现以下错误:
! Package pgf Error: No shape named X1center is known.
知道如何解决这个问题吗?
答案1
用于\space
获取文字空间。
活动字符~
不仅产生空格,还产生不可破坏的空格,保存在\nobreakspace
扩展为\leavevmode\nobreak\␣
(LaTeX)的宏中。
结束宏的技巧\xnum{}
不起作用,因为 TikZ 在某个点执行 a \csname pgf@sh@ma@#1\endcsname
(其中#1
是我们的坐标/节点名称)并且在那时{}
将成为它们的实际字符:No shape named X1{} center is known
。
宏\␣
对以下任一方面都不利csname
: 控制序列\␣
不应该出现在\csname
和之间\endcsname
。(根据原始错误信息自由改编。)
代码
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate (X1 center) at (0,0);
\coordinate (X2 center) at (1,0);
\coordinate (X3 center) at (2,0);
\coordinate (X4 center) at (3,0);
\coordinate (X5 center) at (4,0);
\foreach \xnum in {1,2,3,4,5}
{
\node at (X\xnum\space center) {$x_\xnum$};
}
\end{tikzpicture}
\end{document}
输出
答案2
这是另一种方法,可用于其他情况(例如,\xnum
直接需要持有者宏的内容而无需扩展)。
\documentclass[tikz]{standalone}
\usepackage{tikz,loops}
\begin{document}
\begin{tikzpicture}
\coordinate (X1 center) at (0,0);
\coordinate (X2 center) at (1,0);
\coordinate (X3 center) at (2,0);
\coordinate (X4 center) at (3,0);
\coordinate (X5 center) at (4,0);
\newforeach \xnum in {1,...,5} {\node at (X#1 center) {$x_\xnum$};}
% Or
% \foreachfox {1,...,5} {\node at (X#1 center) {$x_#1$};}
\end{tikzpicture}
\end{document}