在 TikZ 中,我有时需要在坐标名称中使用宏,通常是在使用时\foreach
。我的问题是坐标名称中的宏会消除任何后续空格。
例如,这里有一个关于该问题的例子:
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\def\a{a}
\coordinate (\a 1);
\node at (a1) {Test}; % works correctly
\node at (a 1) {Test}; % error: "No shape named `a 1' is known.
\end{tikzpicture}
\end{document}
在示例中,我\a
在坐标定义中使用了宏(\a 1)
。我期望获取坐标(a 1)
,但是宏后面的空格被消除了,最终只得到了(a1)
。
有什么方法可以告诉 TikZ (或 LaTeX,我真的不知道宏扩展在后台是如何工作的) 我想保留宏后的空格?我尝试过将其转义 ( (\a\ 1)
,无法编译),添加更多空格 ( (\a 1)
,其中任何数量的空格仍会被消除) 并添加一些括号 (({\a} 1)
或(\a{} 1)
,这两种方法都可以防止消除空格,但只是因为括号包含在坐标名称中,分别产生({a} 1)
和(a{} 1)
)。
有没有解决我的问题的方法,或者我只需要避免在宏后使用空格?
答案1
控制序列后的空格会被 TeX 吞噬,因为它们是用来结束控制序列的。
如果您使用{a}
或a{}
将{}
成为节点名称的一部分。(PGF/TikZ\csname
内部使用来存储仅以此方式工作的节点)。
\
是一个特殊的宏,它不只是输入一个,类似
~
(牢不可破的空间)。
您想要使用的是\space
文字:
\coordinate (\a\space 1);
解决方法是,任何非字母字符也会结束控制序列,因此
\coordinate (\a-1); % or (\a -1)
将使坐标被命名,这可能比s 和sa-1
更容易处理。\space
您也可以使用,\def\a#1{a #1}
但是不要这样做,在我看来,这样非常不雅。