我正在尝试生成大量姓名徽章。我想知道,根据 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]
应该产生Laura
where
\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}