如何在 TikZ 中的 \foreach 中动态命名和存储宏/变量以供以后使用?

如何在 TikZ 中的 \foreach 中动态命名和存储宏/变量以供以后使用?

我正在使用\foreach命令在 TikZ 中生成一个图形,使用宏动态设置节点值(改编自这个问题:TikZ:使用循环绘制节点网格)。

现在,我想稍后在文档中重复使用节点的标签,但它们似乎没有被存储(请参阅是否可以引用节点标签并重新使用它来标记 tikz 中的其他节点?)。因此我需要以某种方式使用宏来存储标签。

是否有可能以某种方式动态生成宏/变量的名称(例如\label1,,\label2......,\labelN),然后用来\pgftruncatemacro{\myLabel}{...}在其中存储值?

这是我的代码示例(当然我还没有执行上述操作)。我已经指出了相关部分。我本质上想要获取由\x和索引的变量,\y以便稍后可以将它们用作“ \label\x\y”:

\documentclass{minimal}

\usepackage{tikz}
\tikzset{mainstyle/.style={circle,draw,fill=gray!40,minimum size=20}}

\begin{document}
\begin{tikzpicture}

  \def\xmin{1}
  \def\xmax{4}
  \def\ymin{1}
  \def\ymax{5}
  \def\lattconst{3.0}

  \foreach \x in {\xmin,...,\xmax}
    \foreach \y in {\ymin,...,\ymax}
    {
      %%%
      % This should be a dynamic, e.g. “\{label\x\y}”
      \pgfmathtruncatemacro{\label}{\x - \xmax *  \y + \xmax * \ymax}
      %%%
      \pgfmathsetmacro{\xpos}{\lattconst*\x}
      \pgfmathsetmacro{\ypos}{\lattconst*\y}
      \node [mainstyle] (\x\y) at (\xpos,\ypos) {\label};
    }

\end{tikzpicture}
\end{document}

答案1

这里有一种通过两个宏和来存储\label\x和的关系的方法。\y\storelabel\getlabel

\documentclass{article}
\usepackage{tikz}

\newcommand\storelabel[2]{\expandafter\xdef\csname label#1\endcsname{#2}}
\newcommand\getlabel[1]{\csname label#1\endcsname}

\begin{document}
\begin{tikzpicture}
  \tikzset{mainstyle/.style={circle,draw,fill=gray!40,minimum size=20}}
  \def\xmin{1}
  \def\xmax{4}
  \def\ymin{1}
  \def\ymax{5}
  \def\lattconst{3.0}
  \foreach \x in {\xmin,...,\xmax}
    \foreach \y in {\ymin,...,\ymax}
    {
      \pgfmathtruncatemacro{\label}{\x - \xmax *  \y + \xmax * \ymax}
      \storelabel{\x-\y}{\label}
      %%%
      \pgfmathsetmacro{\xpos}{\lattconst*\x}
      \pgfmathsetmacro{\ypos}{\lattconst*\y}
      \node [mainstyle] (\x-\y) at (\xpos,\ypos) {\label};
    }
\end{tikzpicture}

Label of 3-4 is \getlabel{3-4}.

Label of 1-1 is \getlabel{1-1}.

Label of 4-5 is \getlabel{4-5}.

\end{document}

相关内容