Me gustaría crear algunas insignias con nombres usando un bucle. Tengo una hoja de cálculo con nombres y afiliaciones que guardo en el archivo nombres.csv de la siguiente manera
"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"
Puedo copiar el contenido de nombres.csv en una matriz de cadenas y usar un bucle para recuperar las entradas. El siguiente es un ejemplo de código de trabajo que produce el resultado Apellido2:
\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}
Puedo usar esta idea para crear cientos de credenciales con nombres en un bucle. Pero en lugar de escribir la lista completa en el archivo .tex, me gustaría llamar directamente a mi archivo nombres.csv. Usé el 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 en un bucle sin fin. Entendí que \input{}
funciona igual que copiar y pegar, pero no parece ser el caso. Por supuesto, puedo trabajar en la hoja de cálculo y luego copiar y pegar el contenido del archivo nombres.csv, pero me gustaría entender qué sucede. ¿Alguna pista?
Edición de PD: la solución sugerida es suficiente para mi caso. Pero aún así me gustaría poder definir macros con \input'. It seems that
\input{}' dentro de una macro que no se expande inmediatamente. Quiero decir, si tengo algún código en file.tex', that I want to plugin in a new macro,
\def\mymacro{\input{file}}' guardaré \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', no se entiende como una matriz. Del mismo modo
\begin{filecontent*}{newfile.tex}
\input{file}
\end{filecontent*}
guardará el código \input{file}' in
newfile.tex', pero no el contenido en `file.tex'. ¿Alguien tiene alguna idea de cómo forzar la expansión de la entrada?
Respuesta1
En lugar de importar el archivo csv completo, puede leerlo por filas. Hay algunos paquetes para esto, aquí uso csvsimple
. El archivo names.csv
lo crea el filecontents
entorno solo para tenerlo todo en un solo archivo para este ejemplo.
\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}
Respuesta2
El readarray
paquete está configurado para digerir datos de archivos en matrices.
\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}
Respuesta3
Debe definirlo \names
para que su definición sea el contenido del archivo. Esto significa que se requiere cierta expansión:
\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}