Tikz 节点标签:将当前迭代计数与预定义的索引列表进行比较

Tikz 节点标签:将当前迭代计数与预定义的索引列表进行比较

我没有在这里找到这个问题的答案,如果我忽略了它,请指导我,我会删除这个帖子。

问题是这样的:我试图绘制一个有 88 个元素的编号网格,作为一个 8x11 矩阵。节点标签有点棘手,因为我需要四组节点标签。假设节点标签为 A、B、C 和 D。每个字母都有一组唯一的索引,我想将其分配给这些索引。这些集合遵循我将在外部(例如在 Matlab 中)定义的特定模式,它们可能看起来像这样:

group_A = [12    23    34    45    56    67    78    89]

有没有办法将当前迭代次数与这些数组的条目进行比较,并且仅在这些数组中出现时才使用相应的标签?

然后标签应该出现在计数器上方的行中,这就是为什么会有换行符。

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[node distance=0cm]
    \foreach \i in {0,...,10}
      \foreach \j in {0,...,7}
        {\pgfmathtruncatemacro{\label}{11*\j+\i+1}
        \node (\i*\j+\i) [rectangle, draw=black, align=center, minimum width=1cm] at (1*\i,-1*\j) {\\(\label)};}
\end{tikzpicture}
\end{document}

现在它看起来像这样,缺少标签。基本上,我正在寻找 Matlabs ismember(a,b) 函数的等效函数。

在此处输入图片描述

答案1

假设每个数字只属于一个组,您可以执行如下操作。我制作了一个宏,它接受一个数字并检查该数字是否属于每个组,如果是,则“打印”组的名称。

我缩小了原来的尺寸,但我想你会明白的。

\documentclass[border=2mm]{standalone}
\usepackage{tikz}

\def\groupA{{ 7, 2,11,14}}
\def\groupB{{ 9,16, 5, 4}}
\def\groupC{{ 6, 3,10,15}}
\def\groupD{{12,13, 8, 1}}

\newcommand{\mylabel}[1]
{%
  \pgfmathtruncatemacro\num{#1}
  \foreach\l in {0,...,3}
  {%
    \pgfmathtruncatemacro\temp{\groupA[\l]}%
    \ifnum \num = \temp A\fi
    \pgfmathtruncatemacro\temp{\groupB[\l]}%
    \ifnum \num = \temp B\fi
    \pgfmathtruncatemacro\temp{\groupC[\l]}%
    \ifnum \num = \temp C\fi
    \pgfmathtruncatemacro\temp{\groupD[\l]}%
    \ifnum \num = \temp D\fi
  }
}

\begin{document}
\begin{tikzpicture}[node distance=0cm]
  \foreach\i in {0,...,3} \foreach\j in {0,...,3}
    \node (4*\j+\i) [rectangle, draw, minimum width=1cm] at (1*\i,-1*\j) {\mylabel{4*\j+\i+1}};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是一个使用 的解决方案expl3。如果给定的数字出现在多个组中,则将打印所有相应的标签(如果需要,这很容易更改)。

\documentclass[tikz, border=2mm]{standalone}

\ExplSyntaxOn
\prop_new:N \l_felix_group_labels_prop
\cs_generate_variant:Nn \seq_set_split:Nnn { cV }

\NewDocumentCommand \defineGroup { m m m }
  {
    \prop_put:Nnn \l_felix_group_labels_prop {#1} {#2}
    \seq_clear_new:c { l_felix_group_#1_nums_seq }
    \seq_set_split:cVn { l_felix_group_#1_nums_seq } \c_space_tl {#3}
  }

% #1: item number
% #2: group name (A, B, C... or whatever you want; it's an identifier, not markup)
% #3: LaTeX markup for the associated group label
\cs_new_protected:Npn \__felix_print_item_label:nnn #1#2#3
  {
    \seq_if_in:cnT { l_felix_group_#2_nums_seq } {#1}
      {
        \prop_get:NnN \l_felix_group_labels_prop {#2} \l_tmpa_tl
        \tl_use:N \l_tmpa_tl
      }
  }

\cs_generate_variant:Nn \__felix_print_item_label:nnn { x }

\NewDocumentCommand \labelForItem { m }
  {
    % Expand #1 as in \xdef and iterate over all registered groups
    \prop_map_tokens:Nn \l_felix_group_labels_prop
      { \__felix_print_item_label:xnn {#1} }
  }
\ExplSyntaxOff

\defineGroup{A}{$\color{blue!70!black} \langle A\rangle$}
  {1   12    23    34    45    56    67    78    89} % I added the 1
\defineGroup{B}{$\color{red!70!black} \langle B\rangle$}
  {2 14 26 38 50 62 74 86}
\defineGroup{C}{$\color{green!70!black} \langle C\rangle$}
  {79 69 59 49 39 29 19 9}      % order doesn't matter

\begin{document}
\begin{tikzpicture}[node distance=0cm]
  \foreach \i in {0,...,10}
    \foreach \j in {0,...,7}
      {
        \pgfmathtruncatemacro{\label}{11*\j+\i+1}
        \node (\i*\j+\i) [rectangle, draw=black, align=center, minimum size=1cm]
          at (1*\i,-1*\j) {\labelForItem{\label}\\(\label)};
      }
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容