Ich möchte mithilfe einer Schleife einige Namensschilder erstellen. Ich habe eine Tabelle mit Namen und Zugehörigkeiten, die ich wie folgt in der Datei names.csv speichere
"Name1","Surname1","Affiliation1",
"Name2","Surname2","Affiliation2",
"Name3","Surname3","Affiliation3"
Ich kann den Inhalt von names.csv in ein String-Array kopieren und eine Schleife verwenden, um die Einträge wiederherzustellen. Das Folgende ist ein Beispiel für funktionierenden Code, der die Ausgabe Surname2 erzeugt:
\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}
Ich kann diese Idee verwenden, um Hunderte von Namensschildern in einer Schleife zu erstellen. Aber anstatt die ganze Liste in die .tex-Datei zu schreiben, möchte ich direkt meine names.csv-Datei aufrufen. Ich habe den geänderten Code verwendet
\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{array}
\def\names{{\input{names.csv}}}
\begin{document}
\pgfmathparse{\names[4]}\pgfmathresult
\end{document}
was anscheinend in eine Endlosschleife gerät. Ich habe verstanden, dass das \input{}
genauso funktioniert wie Kopieren und Einfügen, aber das scheint nicht der Fall zu sein. Natürlich kann ich in der Tabelle arbeiten und dann den Inhalt der Datei „names.csv“ kopieren und einfügen, aber ich würde gerne verstehen, was passiert. Irgendwelche Hinweise?
PS-Bearbeitung: Die vorgeschlagene Lösung reicht für meinen Fall. Aber ich möchte trotzdem Makros mit \input'. It seems that
\input{}' definieren können, innerhalb derer ein Makro nicht sofort erweitert wird. Ich meine, wenn ich Code in file.tex', that I want to plugin in a new macro,
\def\mymacro{\input{file}}' habe \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
, wird \names' nicht als Array verstanden. Genauso
\begin{filecontent*}{newfile.tex}
\input{file}
\end{filecontent*}
speichert den Code \input{file}' in
„newfile.tex“, aber nicht den Inhalt in „file.tex“. Hat jemand eine Idee, wie man die Eingabe zum Erweitern zwingt?
Antwort1
Anstatt die ganze CSV-Datei zu importieren, können Sie sie zeilenweise lesen. Dafür gibt es einige Pakete, hier verwende ich csvsimple
. Die Datei names.csv
wird von der Umgebung erstellt filecontents
, damit für dieses Beispiel alles in einer Datei ist.
\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}
Antwort2
Das readarray
Paket ist so eingerichtet, dass es Dateidaten in Arrays aufteilt.
\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}
Antwort3
Sie müssen \names
so definieren, dass die Definition der Inhalt der Datei ist. Dies bedeutet, dass einige Erweiterungen erforderlich sind:
\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}