计算标签的文本

计算标签的文本

我正在写一个 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计数(而不是到)。由于其名称中有一个,因此需要az126@\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}

相关内容