我有一个 tikz 代码,使用存储在一维数组中的值,这里是 MWE:
\documentclass{standalone}
\usepackage{tikz}
\def \myArray {{0,1,2,3}}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro\x{\myArray[0]}
\draw (0,0) node {\x};
\end{tikzpicture}
\end{document}
所以这个对于我的复杂代码来说没问题,但我可以使用 2D 数组和循环来真正改进它。下面是一个最小不工作示例,它可能看起来像这样:
\documentclass{standalone}
\usepackage{tikz}
\def \myArray {{0,1}{2,3}}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro\x{\myArray[1][1]}
\draw (0,0) node {\x};
\end{tikzpicture}
\end{document}
通过此代码,我希望显示值“3”(第二行,第二列)。
有没有办法用 latex/tikz 进行二维数组存储和索引?
答案1
如果您热衷于改变语法,expl3
可以轻松完成:
\documentclass{standalone}
\usepackage{tikz}
\ExplSyntaxOn
\NewDocumentCommand{\definearray}{mm}
{
\seq_gclear_new:c { g_thomas_array_#1_seq }
\seq_set_split:cnn { g_thomas_array_#1_seq } { ; } { #2 }
}
\NewExpandableDocumentCommand{\retrieve}{mmm}
{
\clist_item:en { \seq_item:cn { g_thomas_array_#1_seq } { #2 + 1 } } { #3 + 1 }
}
\cs_generate_variant:Nn \seq_set_split:Nnn { c }
\cs_generate_variant:Nn \clist_item:nn { e }
\ExplSyntaxOff
\definearray{myarray}{0,1;2,3}
\begin{document}
\begin{tikzpicture}
\draw (0,0) node {\retrieve{myarray}{1}{1}};
\end{tikzpicture}
\end{document}
这两个+1
索引都是从 0 开始,与 PGF 数组一样(expl3
序列和逗号分隔列表从 1 开始)。
采用不同的方法,使用不同的语法:
\documentclass{standalone}
\usepackage{tikz}
\ExplSyntaxOn
\NewDocumentCommand{\definearray}{mm}
{
\tl_gclear_new:c { g_thomas_array_#1_tl }
\tl_gset:cn { g_thomas_array_#1_tl } { #2 }
}
\NewExpandableDocumentCommand{\retrieve}{mmm}
{
\clist_item:en { \tl_item:cn { g_thomas_array_#1_tl } { #2 + 1 } } { #3 + 1 }
}
\cs_generate_variant:Nn \clist_item:nn { e }
\ExplSyntaxOff
\definearray{myarray}{{0,1}{2,3}}
\begin{document}
\begin{tikzpicture}
\draw (0,0) node {\retrieve{myarray}{1}{1}};
\end{tikzpicture}
\end{document}
无论哪种情况,输出结果如下: