Eu gostaria de criar alguns crachás usando um loop. Tenho uma planilha com nomes e afiliações que salvo no arquivo nomes.csv da seguinte forma
"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"
Posso copiar o conteúdo denames.csv em uma matriz de strings e usar um loop para recuperar as entradas. A seguir está um exemplo de código funcional que produz a saída 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}
Posso usar essa ideia para criar centenas de crachás em um loop. Mas em vez de escrever a lista inteira no arquivo .tex, gostaria de chamar diretamente meu arquivonames.csv. Eu usei o código modificado
\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}
\def\names{{\input{names.csv}}}
\begin{document}
\pgfmathparse{\names[4]}\pgfmathresult
\end{document}
que aparentemente entra num loop infinito. Entendi que \input{}
funciona da mesma forma que copiar e colar, mas não parece o caso. Claro que posso trabalhar na planilha e depois copiar e colar o conteúdo do arquivo nomes.csv, mas gostaria de entender o que acontece. Alguma pista?
Edição PS: A solução sugerida é suficiente para o meu caso. Mas ainda assim eu gostaria de poder definir macros com \input'. It seems that
\input{}' dentro de uma macro que não seja expandida imediatamente. Quer dizer, se eu tiver algum código em file.tex', that I want to plugin in a new macro,
\def\mymacro{\input{file}}' irá salvar \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' não é entendido como um array. Do mesmo jeito
\begin{filecontent*}{newfile.tex}
\input{file}
\end{filecontent*}
salvará o código \input{file}' in
newfile.tex', mas não o conteúdo em `file.tex'. Alguém tem alguma ideia de como forçar a expansão da entrada?
Responder1
Em vez de importar o arquivo CSV inteiro, você pode lê-lo em linhas. Existem alguns pacotes para isso, aqui eu uso o csvsimple
. O arquivo names.csv
é criado pelo filecontents
ambiente apenas para ter tudo em um arquivo neste exemplo.
\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}
Responder2
O readarray
pacote está configurado para digerir os dados do arquivo em arrays.
\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}
Responder3
Você precisa definir \names
para que sua definição seja o conteúdo do arquivo. Isso significa que alguma expansão é necessária:
\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}