PGF/TikZ:如何将字符串存储在数组中?

PGF/TikZ:如何将字符串存储在数组中?

我正在尝试生成大量姓名徽章。我想知道,根据 PGF 手册,是否可以将姓名作为字符串存储在一个数组中:

\def\myarray{{1,"two",2+1,"IV","cinq","sechs",sin(\i*5)*14}} 

我尝试过这个:

\def\names{{"Katie","Frank","Laura","Joe"}}

没有成功,因为它似乎将整个字符串存储在\names变量中,如果我写

\names[2]

输出将是

"Katie","Frank","Laura","Joe" 

反而

Laura  

就是我想写出来的。

那么为什么这不起作用?我该如何使用数组?它需要一些特殊的库吗?

答案1

这个答案可能比具体涉及 TikZ/PGF 的答案更为通用。

(La)TeX 是一种基于宏的语言,因此与其他语言相比,它在处理“数组”时无法按预期工作。例如,while\names[2]应该产生Laurawhere

\def\names{Katie, Frank, Laura, Joe}

(从 0 开始索引),(La)TeX 认为[2]与 没有任何联系\names。因此,您更有可能获得输出- (如其定义)和Katie, Frank, Laura, Joe[2]的串联。\names[2]

为了能够像通常使用数组那样进行索引,您需要一些其他功能。下面是一个列表解析器的示例,其工作方式与数组的预期方式一样:

在此处输入图片描述

\documentclass{article}
\usepackage{xparse}% http://ctan.org/pkg/xparse
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcounter{listtotal}\newcounter{listcntr}%
\NewDocumentCommand{\names}{o}{%
  \setcounter{listtotal}{0}\setcounter{listcntr}{-1}%
  \renewcommand*{\do}[1]{\stepcounter{listtotal}}%
  \expandafter\docsvlist\expandafter{\namesarray}%
  \IfNoValueTF{#1}
    {\namesarray}% \names
    {% \names[<index>]
     \renewcommand*{\do}[1]{\stepcounter{listcntr}\ifnum\value{listcntr}=#1\relax##1\fi}%
     \expandafter\docsvlist\expandafter{\namesarray}}%
}
\begin{document}
\newcommand{\namesarray}{Katie, Frank, Laura, Joe}%
\verb|\names:|\ \names \par
\verb|\names[2]:|\ \names[2] \par
\verb|\names[0]:|\ \names[0] \par
\verb|\names[5]:|\ \names[5]
\end{document}

这里的想法是将名称存储在一个数组中\namesarray,然后定义一个(或“函数”)可选参数。如果没有提供参数(即,您只使用\names),则打印整个\namesarray。如果提供了参数(形式为\names[<index>]),则按顺序解析列表以找到匹配的项<index>并打印它。

列表解析器依赖于etoolbox\docsvlist枚举器\do

答案2

为了回答您提出的具体问题,这里有一个完整的最小示例。

\documentclass{standalone}
\usepackage{pgfmath}
\begin{document}
\def\names{{"Katie","Frank","Laura","Joe"}}%
\pgfmathparse{\names[2]}\pgfmathresult
\end{document}

因此,您需要使用pgfmath解析器来完成该作业\pgfmathparse,然后使用解析的结果\pgfmathresult:换句话说,您不能\names[2]直接调用。

这是一个带有循环的更完整的示例\foreach

\documentclass{standalone}
\usepackage{pgfmath,pgffor}
\begin{document}
\def\names{{"Katie","Frank","Laura","Joe"}}%
\foreach \i in {0,...,3} {%
  Name \i: \pgfmathparse{\names[\i]}\pgfmathresult, }
\end{document}

答案3

arrayjob包中还有一些用于使用数据数组的宏。

\documentclass{article}
\usepackage{arrayjob}

\newarray\names
\readarray{names}{Katie&Frank&Laura&Joe}

\begin{document}
\verb|\names(3):|\ \names(3) \par
\verb|\names(1):|\ \names(1) \par
\verb|\names(5):|\ \names(5)
\end{document}

在此处输入图片描述

笔记:
数组以 1 为基数(索引从 开始1

答案4

你不需要数组(但pgf手册中描述了数组)。你也不需要数字来“索引”数组。

\documentclass{beamer}
\usepackage{tikz}
   \pgfkeys{/English to German/Peter/.code=Peter,
            /English to German/Mary/.code=Maria,
            /German to English/Peter/.code=Peter,
            /German to English/Maria/.code=Mary}

\pgfkeys{/English to German/Peter}, % -> Peter
\pgfkeys{/English to German/Mary}, % -> Maria
\pgfkeys{/German to English/Peter}, and % -> Peter, and
\pgfkeys{/German to English/Maria}. % -> Mary.
\end{document}

相关内容