8

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}

1 Answers1

8

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 01: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 01: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. –  Dec 20 '18 at 02:56
  • +1 for the students' names! – CarLaTeX Dec 20 '18 at 07:34
  • Thanks, @marmot ! (In fact, I used \setcounter{page}{1}).

    I have an additional problem: The student's names have different quantity of middle names. So, when I compile the file, I get this error:

    ! Package pgfplots Error: input table 'students.csv' has an unbalanced number of columns in row '1' (expected '5' cols; got '4').

    What I could add to the code so it ignores when it finds a row with fewer columns than expected? I would like that the code be able to print as many columns as it finds.

    – FrozenCore Dec 20 '18 at 08:54
  • 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. –  Dec 20 '18 at 13:03