루프를 사용하여 이름 배지를 만들고 싶습니다. 다음과 같이 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{}' 이 있는 매크로를 정의할 수 있으면 즉시 확장되지 않을 수 있기를 바랍니다 . 내 말은 \def\mymacro{\input{file}}'에 일부 코드가 있으면 \names'가 배열로 인식되지 않는다는 것을 file.tex', that I want to plugin in a new macro,
저장한다는 뜻입니다. \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
같은 방법으로
\begin{filecontent*}{newfile.tex}
\input{file}
\end{filecontent*}
newfile.tex' 코드는 저장되지만 \input{file}' in
`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}