我正在写一个 TikZ 图片,其中包括我想用字母标记的正多边形节点。我可以写数字,例如五边形:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node
foreach \i in {0, 1, ..., 4} at (90 + 72 * \i:2.5cm) [name = \i] {\(\i\)};
\end{tikzpicture}
\end{document}
但我想给它们贴上 a、b、... 的标签。是的,我可以手动做,但很累。此外,根据标签命名节点会非常好。
答案1
(La)TeX 解决方案
作为大卫·卡莱尔他在评论中指出,您可以使用\@alph
或\char
从整数中获取字母。
该\@alph
宏是一个 LaTeX 宏,由其使用,\alph{<LaTeX counter>}
例如在环境中用于从到enumerate
计数(而不是到)。由于其名称中有一个,因此需要a
z
1
26
@
\makeatletter
/\makeatother
连击并且由于您也想从0
→开始a
,因此您需要添加1
到实际数字。
\makeatletter
\newcommand*\alphFromZero[1]{\@alph{\numexpr#1+1\relax}}
\makeatother
我们也可以从头开始实现这一点:
\newcommand*\alphFromZero[1]{\ifcase#1 a\or b\or …\or z\else ?\fi}
他指出TeX 原\char
语可以有类似的用途:
\newcommand*\alphFromZero[1]{\char\numexpr`a+#1\relax}
(`a
返回字符的“值” a
,我们只需在其上添加整数并再次返回一个字符。)但是,\char
似乎不可扩展,因此我们不能用它来姓名节点。
前列腺素F/钛钾Z 解决方案
也就是说,TikZ 和 都pgffor
提供了自己的解决方案。
pgffor
pgffor
实际上可以迭代字母,并且使用该count
选项,您可以在循环主体中同时使用字母和整数:
\tikz % nodes are named amed (a), …, (e)
\node foreach[count=\i from 0] \letter in {a, ..., e} at (90 + 72 * \i:2.5cm)
[name = \letter] {\(\letter\)};
钛钾是
更奇特的是(?)你可以使用chains
图书馆以及它的start chain=<chain name> placed <placing formula>
关键placing formula
在于
at=({90+72*(\tikzchaincount-1)}:2.5cm)}
我们可以用来\tikzchaincount
指我链中的第 个节点(它从 开始,1
这就是我们必须1
再次减去的原因)。然后您只需使用on chain=<chain name>
该节点,它就会根据 自动放置placing formula
。
您仍然可以使用name
键单独命名节点。它们将以<chain name>-<i>
(where <i>
again starts at 1
) 和您自己的名称提供。
代码
\documentclass[tikz]{standalone}
\makeatletter
\newcommand*\alphFromZero[1]{\@alph{\numexpr#1+1\relax}}
% or:
% \newcommand*\alphFromZero[1]{\ifcase#1 a\or b\or …\or z\else ?\fi}
\makeatother
\usetikzlibrary{chains}
\begin{document}
\tikz % nodes are named (a), …, (e)
\node foreach \i in {0, 1, ..., 4} at (90 + 72 * \i:2.5cm)
[name = \alphFromZero{\i}] {\(\alphFromZero{\i}\)};
\tikz % nodes are named amed (a), …, (e)
\node foreach[count=\i from 0] \letter in {a, ..., e} at (90 + 72 * \i:2.5cm)
[name = \letter] {\(\letter\)};
\begin{tikzpicture}[
start chain=polygon placed {at=({90+72*(\tikzchaincount-1)}:2.5cm)}]
\node foreach \letter in {a, ..., e}
[on chain, name = \letter] {\(\letter\)};
% named (a), …, (e) and (polygon-1), …, (polygon-5)
\draw (polygon-1) -- (c);
\end{tikzpicture}
\end{document}