我没有在这里找到这个问题的答案,如果我忽略了它,请指导我,我会删除这个帖子。
问题是这样的:我试图绘制一个有 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}