我想使用循环创建一些姓名徽章。我有一个包含姓名和所属关系的电子表格,我将其保存在 names.csv 文件中,如下所示
"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"
我可以将 names.csv 的内容复制到字符串数组中,并使用循环恢复条目。以下是生成输出 Surname2 的有效代码示例:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}
\def\names{{"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"}}
\begin{document}
\pgfmathparse{\names[4]}\pgfmathresult
\end{document}
我可以使用这个想法循环创建数百个姓名徽章。但我不会将整个列表写入 .tex 文件中,而是直接调用我的 names.csv 文件。我使用了修改后的代码
\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}
\def\names{{\input{names.csv}}}
\begin{document}
\pgfmathparse{\names[4]}\pgfmathresult
\end{document}
这显然进入了一个无限循环。我知道这\input{}
就像复制粘贴一样,但似乎并非如此。当然,我可以在电子表格中工作,然后复制粘贴 names.csv 文件内容,但我想了解会发生什么。有什么线索吗?
PS 编辑:建议的解决方案对我的情况来说已经足够了。但我仍然希望能够定义宏,\input'. It seems that
宏中的 \input{}' 不会立即展开。我的意思是,如果我在file.tex', that I want to plugin in a new macro,
\def\mymacro{\input{file}}' 中有一些代码,则会保存\mymacro' as '\input{file}' and will only look what's inside the file when I call the macro in the document. That's why in the previous example
\names' 不被理解为数组。以同样的方式
\begin{filecontent*}{newfile.tex}
\input{file}
\end{filecontent*}
将保存代码\input{file}' in
newfile.tex',但不会保存“file.tex”中的内容。有人知道如何强制扩展输入吗?
答案1
您可以逐行读取,而不必导入整个 csv 文件。有一些包可以做到这一点,这里我使用csvsimple
。该文件names.csv
由环境创建,filecontents
只是为了将所有内容放在一个文件中以供本示例使用。
\documentclass{article}
\usepackage{filecontents}
%% Create file
\begin{filecontents*}{names.csv}
Name1, Surname1, Affiliation1
Name2, S. Urname2, A f filiation2
Name3, Surname3, Affiliation3
Name4, Surname4, Affiliation4
Name5, Surname5, Affiliation5
\end{filecontents*}
\usepackage{tikz}
\usepackage{csvsimple}
\begin{document}
List of participants:
\begin{itemize}
\csvreader[no head]{names.csv}{1=\name, 2=\surname, 3=\affiliation}{%
\item \name\ \surname\ at \affiliation
}
\end{itemize}
Badges:\newline
\csvreader[no head]{names.csv}{1=\name, 2=\surname, 3=\affiliation}{%
\begin{tikzpicture}
\draw[clip] (0,0) rectangle (6,4);
\node at (3,2){\Large\name\ \surname};
\node at (3,1.3){\affiliation};
%% Logo
\fill[color=red!40] (0.7,3.3) circle(1);
\node[fill=green!40,opacity=0.5,rounded corners=5pt,anchor=west] at (0.8,3.5){\textsf{The Epic Event}};
\node[anchor=west] at (0.8,3.5){\textsf{The Epic Event}};
\end{tikzpicture}
}
\end{document}
答案2
该readarray
包被设置为将文件数据消化成数组。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{names.csv}
Name1,Surname1,Affiliation1,
Name2,Surname2,Affiliation2,
Name3,Surname3,Affiliation3
\end{filecontents*}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}
\usepackage{readarray}
\readarraysepchar{,}
\begin{document}
\readdef{names.csv}\namedata
\readarray\namedata\names[-,\ncols]
\names[2,2] and \names[3,3]
\end{document}
答案3
您需要定义\names
以便其定义是文件的内容。这意味着需要进行一些扩展:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}
\begingroup
\makeatletter
\endlinechar=-1\relax
\everyeof{\noexpand}\relax
\edef\x{\endgroup\def\noexpand\names{{\@@input names.csv }}}\x
\begin{document}
\pgfmathparse{\names[4]}\pgfmathresult
\end{document}