7

I'd like to generate a single PDF file containing multiple exams (template available below).

Each exam must have the field 'name' (see template) filled with the name of a student taken from a external list file (such as .csv).

enter image description here

Template:

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[top=6mm,includehead,left=1.5cm,bottom=2cm,right=1.5cm,headsep=0.5cm]{geometry}
\usepackage{tikz}
\usepackage{multicol} 
\usepackage{xcolor}
\usepackage{fancyhdr} 
\usepackage{lipsum}

\renewcommand{\footrulewidth}{1.2pt} % linha no footer
\renewcommand{\headrulewidth}{1.2pt}% linha no header 

\lfoot{\ttfamily \today}
\rfoot{\ttfamily 14 de dezembro de 2018}

\pagestyle{fancy} 

\fancypagestyle{firststyle}{%
  \renewcommand{\headrulewidth}{0pt}% Remove header rule
  \lhead{%
    \def\scale{0.6}%
    \def\roundc{\scale*0.1cm}% rc = 10% de sc
    \raisebox{-2\baselineskip}[0pt][0pt]{\begin{tikzpicture}[scale=\scale]
      \definecolor{tempcolor}{RGB}{200,25,30}
      \filldraw[tempcolor][rounded corners=\roundc] (2cm,0cm) rectangle (1.2cm,-0.5cm);
      \filldraw[tempcolor][rounded corners=\roundc] (2cm,-0.6cm) rectangle (1.1cm,-1.1cm);
      \filldraw[tempcolor][rounded corners=\roundc] (2cm,-0.6cm) rectangle (1.5cm,-1.1cm);
      \filldraw[tempcolor][rounded corners=\roundc] (1.7cm,-1.2cm) rectangle (1.2cm,-1.7cm);
      \filldraw[tempcolor][rounded corners=\roundc] (0.6cm,-1.2cm) rectangle (1.1cm,-1.7cm);
      \filldraw[tempcolor][rounded corners=\roundc] (1.6cm,-1.2cm) rectangle (1.8cm,-1.7cm);
      \filldraw[tempcolor][rounded corners=\roundc] (1.7cm,-1.8cm) rectangle (1.2cm,-2.3cm);
      \node[scale=\scale,fill=white] at (5.92,-0.85) {\resizebox{6.7cm}{0.5cm}{\sffamily \textbf{ESCOLA}}};
      \node[scale=\scale,fill=white] at (4.52,-1.55) {\resizebox{5cm}{0.5cm}{\sffamily {Construindo o Futuro}}};
    \end{tikzpicture}}
  }
  \chead{\raisebox{-2\baselineskip}[0pt][0pt]{\rule[-2.5\baselineskip]{\linewidth}{1.2pt}}}
  \rhead{\raisebox{-2\baselineskip}[0pt][0pt]{\begin{tabular}{@{}r@{}}
    \tikz \node at (0,0) {\textbf{Final Exam}};\\ 
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=8.5cm, minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label distance=-2mm,inner xsep=2pt]90:{\ttfamily Name}:}] {\phantom{\ttfamily 15,0}};}   
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=2cm, minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label distance=-2mm,inner xsep=2pt]90:{\ttfamily Turma}:}] {\phantom{\ttfamily 15,0}};}   
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=1.5cm, minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label distance=-2mm,inner xsep=2pt]90:{\ttfamily Valor}:}] {\ttfamily 15,0};} 
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=1.5cm, minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label distance=-2mm,inner xsep=2pt]90:{\ttfamily Nota}:}] {\phantom{\ttfamily 15,0}};}
    \end{tabular}}
  }
  \lfoot{\ttfamily Prof. Lucas}
  \rfoot{\ttfamily \today}
}

\AtBeginDocument{
  \thispagestyle{firststyle}
  \vspace*{2\baselineskip}
}

\begin{document}

\begin{multicols}{2} 

\begin{enumerate}

\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]

\end{enumerate}

\end{multicols}

\end{document}
7

Sure, it's possible. I focus on the loop that reads data from a csv file and builds a multipage document. I do not, at this point, change your TikZ code, which can be simplified. Anyway, this reads the names from a file and prints the "exams".

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[top=6mm,includehead,left=1.5cm,bottom=2cm,right=1.5cm,headsep=0.5cm]{geometry}
\usepackage{tikz}
\usepackage{multicol} 
\usepackage{xcolor}
\usepackage{fancyhdr} 
\usepackage{lipsum}

\renewcommand{\footrulewidth}{1.2pt} % linha no footer
\renewcommand{\headrulewidth}{1.2pt}% linha no header 

\lfoot{\ttfamily \today}
\rfoot{\ttfamily 14 de dezembro de 2018}

\pagestyle{fancy} 

\fancypagestyle{firststyle}{%
  \renewcommand{\headrulewidth}{0pt}% Remove header rule
  \lhead{%
    \def\scale{0.6}%
    \def\roundc{\scale*0.1cm}% rc = 10% de sc
    \raisebox{-2\baselineskip}[0pt][0pt]{\begin{tikzpicture}[scale=\scale]
      \definecolor{tempcolor}{RGB}{200,25,30}
      \filldraw[tempcolor][rounded corners=\roundc] (2cm,0cm) rectangle (1.2cm,-0.5cm);
      \filldraw[tempcolor][rounded corners=\roundc] (2cm,-0.6cm) rectangle (1.1cm,-1.1cm);
      \filldraw[tempcolor][rounded corners=\roundc] (2cm,-0.6cm) rectangle (1.5cm,-1.1cm);
      \filldraw[tempcolor][rounded corners=\roundc] (1.7cm,-1.2cm) rectangle (1.2cm,-1.7cm);
      \filldraw[tempcolor][rounded corners=\roundc] (0.6cm,-1.2cm) rectangle (1.1cm,-1.7cm);
      \filldraw[tempcolor][rounded corners=\roundc] (1.6cm,-1.2cm) rectangle (1.8cm,-1.7cm);
      \filldraw[tempcolor][rounded corners=\roundc] (1.7cm,-1.8cm) rectangle (1.2cm,-2.3cm);
      \node[scale=\scale,fill=white] at (5.92,-0.85) {\resizebox{6.7cm}{0.5cm}{\sffamily \textbf{ESCOLA}}};
      \node[scale=\scale,fill=white] at (4.52,-1.55) {\resizebox{5cm}{0.5cm}{\sffamily {Construindo o Futuro}}};
    \end{tikzpicture}}
  }
  \chead{\raisebox{-2\baselineskip}[0pt][0pt]{\rule[-2.5\baselineskip]{\linewidth}{1.2pt}}}
  \rhead{\raisebox{-2\baselineskip}[0pt][0pt]{\begin{tabular}{@{}r@{}}
    \tikz \node at (0,0) {\textbf{Final Exam}};\\ 
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=8.5cm,
    minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label
    distance=-2mm,inner xsep=2pt]90:{\ttfamily Name}:}] {\myname\phantom{\ttfamily 15,0}};}   
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=2cm, minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label distance=-2mm,inner xsep=2pt]90:{\ttfamily Turma}:}] {\phantom{\ttfamily 15,0}};}   
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=1.5cm, minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label distance=-2mm,inner xsep=2pt]90:{\ttfamily Valor}:}] {\ttfamily 15,0};} 
    \tikz[baseline]{\node[anchor=base, draw=black, thick, minimum width=1.5cm, minimum height=7mm,rounded corners, yshift=-2mm,label={[fill=white,label distance=-2mm,inner xsep=2pt]90:{\ttfamily Nota}:}] {\phantom{\ttfamily 15,0}};}
    \end{tabular}}
  }
  \lfoot{\ttfamily Prof.\ Lucas}
  \rfoot{\ttfamily \today}
}

\AtBeginDocument{
  \thispagestyle{firststyle}
  \vspace*{2\baselineskip}
}
\usepackage{xstring}
\usepackage{pgfplotstable}
% from https://tex.stackexchange.com/a/445369/121799
\newcommand*{\ReadOutElement}[4]{%
    \pgfplotstablegetelem{#2}{#3}\of{#1}%
    \let#4\pgfplotsretval
}

\usepackage{filecontents}
\begin{filecontents*}{students.csv}
first last middle
Carla TeX nan
Karl Koala Konrad
TokZ Mouse {Topolino Jerry}
\end{filecontents*}

\begin{document}
\pgfplotstableread{students.csv}\loadedtable
\pgfplotstablegetrowsof{\loadedtable}
\pgfmathtruncatemacro{\rownum}{\pgfplotsretval-1}
\foreach \X in {0,...,\rownum}
{\setcounter{page}{1}
\ReadOutElement{\loadedtable}{\X}{first}{\tmpfirst}
\ReadOutElement{\loadedtable}{\X}{last}{\tmplast}
\ReadOutElement{\loadedtable}{\X}{middle}{\tmpmiddle}
\typeout{\tmpmiddle}
\IfStrEq{\tmpmiddle}{nan}{\xdef\myname{\tmpfirst~\tmplast}}{\xdef\myname{\tmpfirst~\tmpmiddle~\tmplast}}
\thispagestyle{firststyle}
\vspace*{2\baselineskip}
\begin{multicols}{2} 

\begin{enumerate}

\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]
\item \lipsum[1]

\end{enumerate}

\end{multicols}
\clearpage

}
\end{document}

enter image description here

  • Great! Only a detail: From this suggested code the page numbering runs continually. How could I fix it? – FrozenCore Dec 20 '18 at 1:14
  • I found other trouble: The code only supports two column entries (name + surname) at csv file. How it can be modified for a arbitrary number of midle names? – FrozenCore Dec 20 '18 at 1:45
  • 1
    @LucasMartins Just add columns middle1, middle2 etc. and read them out with \ReadOutElement{\loadedtable}{\X}{middle1}{\tmpfmidone} etc. Page numbers can be reset e.g. with \setcounter{page}{0}. I am not really online now, but if you continue having problems let me know, I will be online in a bit. – user121799 Dec 20 '18 at 2:56
  • +1 for the students' names! – CarLaTeX Dec 20 '18 at 7:34
  • 1
    @LucasMartins I added a proposal to fix it. If the student has no middle name, put nan, if (s)he has several, put them in braces. – user121799 Dec 20 '18 at 13:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.