Array/Liste/Sequenz für sich wiederholenden Code verwenden?

Array/Liste/Sequenz für sich wiederholenden Code verwenden?

Für die Vorlage eines Deckblatts für eine Doktorarbeit an unserer Universität gibt es den folgenden Code:

%%% Jury member n1 (Président) %%%
\newcommand{\jurynameA}{M. Cabot}
\newcommand{\juryadressA}{Someplace}
\newcommand{\jurygradeA}{Somerank}
\newcommand{\juryroleA}{Président du jury}
%%% Jury member n2 (Rapporteur) %%%
\newcommand{\jurynameB}{M. Blonde}
\newcommand{\juryadressB}{Anotherplace}
\newcommand{\jurygradeB}{Anotherrank}
\newcommand{\juryroleB}{Rapporteur} % 
%%% Jury member n3 (Rapporteur) %%%
\newcommand{\jurynameC}{M. Blue}
\newcommand{\juryadressC}{Someotherplace}
\newcommand{\jurygradeC}{Someotherrank}
\newcommand{\juryroleC}{Rapporteur}
%%% Jury member n4 (Examinateur) %%%
\newcommand{\jurynameD}{M. Brown}
\newcommand{\juryadressD}{Yetanotherplace}
\newcommand{\jurygradeD}{Yetanotherrank}
\newcommand{\juryroleD}{Examinateur}
%%% Jury member n5 (Examinateur) %%%
\newcommand{\jurynameE}{M. Orange}
\newcommand{\juryadressE}{Onemoreplace}
\newcommand{\jurygradeE}{One more rank}
\newcommand{\juryroleE}{Examinateur}
%%% Jury member n6 (Directeur) %%%
\newcommand{\jurynameF}{M. Pink}
\newcommand{\juryadressF}{Yourplace}
\newcommand{\jurygradeF}{HDR}
\newcommand{\juryroleF}{Directeur de thèse}
%%% Jury member n7 (Co-Directeur) %%%
\newcommand{\jurynameG}{M. White}
\newcommand{\juryadressG}{Yourotherplace}
\newcommand{\jurygradeG}{HDR?}
\newcommand{\juryroleG}{Co-Directeur de thèse}
\begin{tabular}{lll}

    \textsc{\jurynameA}  & \jurygradeA & (\juryroleA) \\
    \null  & \textit{\juryadressA} & \\

    \textsc{\jurynameB}  & \jurygradeB & (\juryroleB) \\
    \null  & \textit{\juryadressB} & \\

    \textsc{\jurynameC}  & \jurygradeC & (\juryroleC) \\
    \null  & \textit{\juryadressC} & \\

    \textsc{\jurynameD}  & \jurygradeD & (\juryroleD) \\
    \null  & \textit{\juryadressD} & \\

    \textsc{\jurynameE}  & \jurygradeE & (\juryroleE) \\
    \null  & \textit{\juryadressE} & \\

    \textsc{\jurynameF}  & \jurygradeF & (\juryroleF) \\
    \null  & \textit{\juryadressF} & \\

    \textsc{\jurynameG}  & \jurygradeG & (\juryroleG) \\
    \null  & \textit{\juryadressG} & \\

\end{tabular}

Ich habe mich gefragt, ob es möglich wäre, die Daten einfacher einzugeben (etwa wie \addmember{M. Pink}{Yourplace}{HDR}{Directeur de thèse}) und die Tabelle dann automatisch erstellen zu lassen, ohne sich um die Anzahl der Jurymitglieder kümmern zu müssen (manche haben vielleicht 4 Mitglieder, manche bis zu 8).

In Python hätte ich beispielsweise eine Liste von Dicts verwendet (oder einfach Listen, wenn mir die Semantik egal wäre), wobei jedes Dict ein Jurymitglied beschreibt, und hätte diese Liste durchlaufen, um die Tabelle zu schreiben. Ist so etwas mit LaTeX möglich?

Antwort1

etoolboxHier ist eine Möglichkeit, dies mit Standard-LaTeX-Methoden von und zu tun pgffor.

\documentclass{article}
\usepackage{pgffor,etoolbox,array}
\newcounter{members}
\newcommand{\addmember}[4]{%
\ifnum\value{members}=8
    \typeout{Warning: your committee has too many members! Extra members ignored.}
\else
    \stepcounter{members}
    \csgdef{juryname\themembers}{#1}
    \csgdef{juryadress\themembers}{#2}
    \csgdef{jurygrade\themembers}{#3}
    \csgdef{juryrole\themembers}{#4}
\fi
}
\newcommand{\thecommitee}{}
\makeatletter
\newcommand{\makecommittee}{%
\foreach \x in {1,...,\value{members}}{
\protected@xappto{\thecommittee}{%
\csuse{juryname\x} &
\csuse{jurygrade\x} &
(\csuse{juryrole\x})\tabularnewline
&\itshape\csuse{juryadress\x} &\tabularnewline
}
}
\begin{tabular}{>{\scshape}lll}
\thecommittee
\end{tabular}
}
\makeatother
\begin{document}
\addmember{M. Cabot}{Montréal}{PhD}{Président du jury}
\addmember{M. Blonde}{Trois Rivières}{PhD}{Rapporteur}
\addmember{M. Brun}{Québec}{PhD}{Examinateur}
\addmember{M. Vert}{Paris}{PhD}{Examinateur}
\addmember{M. Gris}{Montréal}{PhD}{Directeur de thèse}
\makecommittee
\end{document}

Ausgabe des Codes

verwandte Informationen