Diese Frage wurde tatsächlich 2010 auf komascript.de an mich herangetragen. Es ging dabei darum, eine Liste aller Schüler mit ihren Eltern zu erstellen. Um einen Bezug zu KOMA-Script herzustellen, habe ich dann eine Lösung auf Basis der von scrlttr2 und scrletter aber auch dem wenig beachteten Paket scraddr erarbeitet.
Die \addrentry-Befehle von scraddr haben 9 Argumente, von denen die Bedeutung der meisten frei wählbar ist. Nehmen wir die Argumente haben folgende Bedeutung:
Dabei sei festgelegt, dass bei den Eltern Eigenes Kürzel entweder als Kürzel des ersten Elternteils oder als Kürzel des zweiten Elternteils dupliziert wird. Es werden also bei Eltern nicht deren Eltern (und somit die Großeltern des Schülers) eingetragen, sondern tatsächlich ebenfalls die Eltern des Kindes. Damit sind dann Eltern einfach daran zu erkennen, dass das 9. Argument entweder als 7. oder 8. Argument dupliziert ist. Bei Kindern hingegen unterscheiden sich alle drei Kürzel.
Hier ist auch bereits eine Schwäche der Lösung zu erkennen. Sie eignet sich nur für Familien mit höchstens zwei Elternteilen oder sagen wir besser: Erziehungsberechtigten.
Der Datensatz für ein Kind könnte dann als adr-Datei wie folgt aussehen:
\addrentry{Müller}{Leonard}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{}{Leonard@Müller.invalid}
{MuellerFranka}{MuellerFranz}{MuellerLeonard}
\addrentry{Müller}{Franka}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{0176 458763325}{Franka@Müller.invalid}
{MuellerFranka}{MuellerFranz}{MuellerFranka}
\addrentry{Müller}{Franz}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{0176 458763327}{Franz\_Peter@Müller.invalid}
{MuellerFranka}{MuellerFranz}{MuellerFranz}
An den Daten ist zu erkennen, dass Leonard Müller das Kind ist, denn das 9. Argument wiederholt sich weder im 7. noch im 8. Argument. Franka Müller ist das erste Elternteil, Franz Müller das zweite, wobei dies keine Wertung darstellen soll. Nehmen wir an, Leonard hat noch eine jüngere Schwester, die aufgrund ihrer überragenden Intelligenz bereits eine Klasse übersprungen hat, so erweitert sich der Datensatz lediglich um:
\addrentry{Müller}{Leonie}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{0176 458763326}{Leonie@mensa.invalid}
{MuellerFranka}{MuellerFranz}{MuellerLeonie}
Damit zeigt sich dann auch, dass wir uns besser nicht darauf verlassen sollten, dass die Eltern immer auf das Kind folgen. Ein weiterer solcher Fall wäre, wenn Herr Müller ein rechter Herumtreiber wäre und es daher auch noch ein weiteres Kind von ihm aber mit einer anderen Mutter in derselben Klasse gäbe. Seine Mutter erlaubt dem Kind aber weder Handy noch E-Mail:
\addrentry{Mayer}{Kay}{Alte Mayerrei 4\\ 16507 Berlin}
{}{}{}
{MayerSabine}{MuellerFranz}{MayerKay}
\addrentry{Mayer}{Sabine}{Alte Mayerrei 4\\ 16507 Berlin}
{}{0176 4587663220}{Sabine.Mayer@invalid.invalid}
{MayerSabine}{MuellerFranz}{MayerSabine}
Allerdings war Frau Müller vor ihrer Heirat auch kein Engel. Ihr Kind aus dieser Zeit hatte es nicht leicht und deshalb eine Klasse wiederholt. Den Vater kennt sie nicht oder will ihn angeben:
\addrentry{Huber}{Chris}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{}{Chris@Müller.invalid}
{MuellerFranka}{}{HuberChris}
Wir kennen nun nebenbei auch den Mädchenname von Frau Müller.
So ganz einfach müssen die Familienverhältnisse in der Klasse also nicht sein. Es ist übrigens auch egal, ob man bei Alleinerziehenden das 7. oder 8. Argument leer lässt.
Um später auf die Eltern über die Kürzel im 7. oder 8. Argument zugreifen zu können, verwenden wir Paket scraddr und Laden die Adressdatei per \InputAddressFile. Wir müssen nun also nur Kinder identifizieren, wie das oben bereits erklärt wurde. Für den Vergleich des 9. Arguments mit dem 7. und 8. verwenden wir die KOMA-Script-Anweisung \Ifstr. Für den Test auf leere Argumente einfach \IfArgIsEmpty. So ergibt sich:
\begin{filecontents*}[overwrite]{elternsprecher.adr}
\addrentry{Müller}{Leonard}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{}{Leonard@Müller.invalid}
{MuellerFranka}{MuellerFranz}{MuellerLeonard}
\addrentry{Müller}{Franka}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{0176 458763325}{Franka@Müller.invalid}
{MuellerFranka}{MuellerFranz}{MuellerFranka}
\addrentry{Müller}{Franz}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{0176 458763327}{Franz\_Peter@Müller.invalid}
{MuellerFranka}{MuellerFranz}{MuellerFranz}
\addrentry{Müller}{Leonie}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{0176 458763326}{Leonie@mensa.invalid}
{MuellerFranka}{MuellerFranz}{MuellerLeonie}
\addrentry{Mayer}{Kay}{Alte Mayerrei 4\\ 16507 Berlin}
{}{}{}
{MayerSabine}{MuellerFranz}{MayerKay}
\addrentry{Mayer}{Sabine}{Alte Mayerrei 4\\ 16507 Berlin}
{}{0176 4587663220}{Sabine.Mayer@invalid.invalid}
{MayerSabine}{MuellerFranz}{MayerSabine}
\addrentry{Huber}{Chris}{Müllerstraße 10\\ 16507 Berlin}
{030~78554685}{}{Chris@Müller.invalid}
{MuellerFranka}{}{HuberChris}
\end{filecontents*}
\documentclass[DIV=18]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{scraddr}
\InputAddressFile{elternsprecher}
\newcommand*{\addrentry}[9]{%
\Ifstr{#7}{#9}{% selbst = Eltern 1, also ignorieren
}{%
\Ifstr{#8}{#9}{% selbst = Eltern 2, also ignorieren
}{% selbst != Eltern 1 AND selbst != Eltern 2, also Kind
\minisec{#2\nobreakspace #1}
\begin{minipage}{\linewidth}% die ganze Familie zusammen halten
\showvalues{#3}{#4}{#5}{#6}% Adresse, Telefon, E-Mail anzeigen
\IfArgIsEmpty{#7}{% kein Eltern 1, also Eltern 1 ignorieren
}{%
\medskip\hspace*{1em}\parbox[t]{\dimexpr \linewidth-1em\relax}{%
\FirstName{#7}\nobreakspace\LastName{#7}\par
\showvalues{\Address{#7}}{\Telephone{#7}}{\FreeI{#7}}{\FreeII{#7}}%
}\par
}%
\IfArgIsEmpty{#8}{% kein Eltern 2, also Eltern 2 ignorieren
}{%
\medskip\hspace*{1em}\parbox[t]{\dimexpr \linewidth-1em\relax}{%
\FirstName{#8}\nobreakspace\LastName{#8}\par
\showvalues{\Address{#8}}{\Telephone{#8}}{\FreeI{#8}}{\FreeII{#8}}%
}\par
}%
\end{minipage}\par
}%
}%
}
\newcommand*{\showvalues}[4]{%
\strut{\renewcommand*\\[1][]{, }#1}\par\noindent
\mbox{Festnetz: \IfArgIsEmpty{#2}{---}{#2}},
\mbox{Mobil: \IfArgIsEmpty{#3}{---}{#3}},
\mbox{E-Mail: \IfArgIsEmpty{#4}{---}{#4}}\par
}
\begin{document}
\input{elternsprecher.adr}
\end{document}
Anmerkung: Auch wenn das Beispiel zeigt, dass adr-Dateien ein durchaus mächtiges Werkzeug sein können, sollte man das gezeigte Beispiel der Patchworkfamilie nicht übermäßig ernst oder wichtig nehmen. Heutzutage würde sich empfehlen, stattdessen mit Strukturen beispielsweise auf Basis von l3prop zu arbeiten. Das hier zu zeigen, wäre jedoch am Thema, nämlich KOMA-Script, vorbei.