So wie ich bereits in [meiner Antwort zur Aufteilung einer PDF-Datei in mehrere](http://texwelt.de/wissen/fragen/20930/einzelne-pdftex-files-mit-datatool-erstellen/20933) gezeigt habe, wie man eine Skriptdatei schreiben kann, kann man natürlich auch für jeden Datenbankeintrag eine eigene TeX-Datei erzeugen:
\documentclass[12pt,parskip=true]{scrartcl}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
PunktA,PunktB,PunktC,PunktD,VektorV,VektorW
0,1,1,1,1,0
3,2,-2,4,-5,2
\end{filecontents*}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{,}
\DTLloaddb{namelist}{test.csv}
\newwrite\texfile
\makeatletter
\newcommand\writetexfile[2]{%
\immediate\openout\texfile #1
\immediate\write\texfile{#2}%
\immediate\closeout\texfile
}
\makeatother
\newcounter{texfile}
\newcommand\writenotexfile[1]{%
\stepcounter{texfile}%
\writetexfile{\jobname-\thetexfile.tex}{#1}%
}
\begin{document}
\DTLforeach*{namelist}{
\PunktA=PunktA,%
\PunktB=PunktB,%
\PunktC=PunktC,%
\PunktD=PunktD,%
\VektorV=VektorV,%
\VektorW=VektorW%
}{%
\writenotexfile{%
Bestimmen Sie den Vektor $\string\overrightarrow{AB}$:
\string\[A(\PunktA,\PunktB),\string~B(\PunktC,\PunktD),\string~\string\overrightarrow{AB}=\string\begin{pmatrix}
\VektorV \string\\ \VektorW\string\end{pmatrix}\string\]
}%
}
\end{document}
Als Ergebnis erhält man dann fortlaufend nummerierte Dateien (wieder mit dem Basisnamen der Hauptdatei als Präfix).
Zerbrechliche Befehle wie `\overrightarrow`, `~`, `\begin` und `\end`, `\[` und `\]` sollte man dabei direkt als String in die Datei schreiben lassen, also mit `\string` vor jeglicher Expansion bewahren. Die Datenbank-Informationen sollen dagegen in der Regel expandiert werden. Daher habe ich `\PunktA` etc. nicht geschützt. Allerdings kann es passieren, dass in der Datenbank selbst wieder Befehle enthalten sind, die dann nicht expandiert werden sollen. In dem Fall, kann man mit Konstrukten wie `\expandafter\detokenize\expandafter{\PunktA}` oder `\unexpanded\expandafter{\PunktA}` arbeiten.
Es sei darauf hingewiesen, dass bei Verwendung von `inputenc` auch Sonderzeichen außerhalb US-ASCII Befehle sind. Man kann auch diese bei Bedarf mit `\detokenize` schützen:
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
A;B;C
1;2;3
4;5;6
\end{filecontents*}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{daten}{test.csv}
\usepackage{verbatim}
\newwrite\texfile
\makeatletter
\newcommand\writetexfile[2]{%
\immediate\openout\texfile #1
\immediate\write\texfile{#2}%
\immediate\closeout\texfile
}
\makeatother
\newcounter{texfile}
\newcommand\writenotexfile[1]{%
\stepcounter{texfile}%
\writetexfile{\jobname-\thetexfile.tex}{#1}%
}
\begin{document}
\DTLforeach*{daten}{
\A=A,%
\B=B,%
\C=C%
}{%
\writenotexfile{%
Text mit Umlauten \detokenize{Ä Ö Ü}
}%
}
\verbatiminput{\jobname-1.tex}
\end{document}
Man kann das auch nur für einzelne Zeichen automatisieren, wenn man die Anweisung `\protected@immediate@write` verwendet, die `scrlfile` (wird von allen KOMA-Script-Klassen automatisch geladen) verwendet:
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
A;B;C
1;2;3
4;5;6
\end{filecontents*}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{daten}{test.csv}
\usepackage{verbatim}
\newwrite\texfile
\makeatletter
\newcommand\writetexfile[2]{%
\immediate\openout\texfile #1
\protected@immediate@write\texfile{\defÄ{\detokenize{Ä}}\defÖ{\detokenize{Ö}}\defÜ{\detokenize{Ü}}}{#2}%
\immediate\closeout\texfile
}
\makeatother
\newcounter{texfile}
\newcommand\writenotexfile[1]{%
\stepcounter{texfile}%
\writetexfile{\jobname-\thetexfile.tex}{#1}%
}
\begin{document}
\DTLforeach*{daten}{
\A=A,%
\B=B,%
\C=C%
}{%
\writenotexfile{%
Text mit Umlauten Ä Ö Ü
}%
}
\verbatiminput{\jobname-1.tex}
Ergibt: \input{\jobname-1.tex}
\end{document}
Wenn es hingegen nur darum geht, dass man die Datei wieder in eine andere Datei einladen kann, die `\usepackage[utf8]{inputenc}` verwendet, kann man auch einfach zu `\@sanitize` greifen:
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
A;B;C
1;2;3
4;5;6
\end{filecontents*}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{daten}{test.csv}
\usepackage{verbatim}
\newwrite\texfile
\makeatletter
\newcommand\writetexfile[2]{%
\immediate\openout\texfile #1
\protected@immediate@write\texfile{\@sanitize}{#2}%
\immediate\closeout\texfile
}
\makeatother
\newcounter{texfile}
\newcommand\writenotexfile[1]{%
\stepcounter{texfile}%
\writetexfile{\jobname-\thetexfile.tex}{#1}%
}
\begin{document}
\DTLforeach*{daten}{
\A=A,%
\B=B,%
\C=C%
}{%
\writenotexfile{%
Text mit Umlauten Ä Ö Ü
}%
}
\verbatiminput{\jobname-1.tex}
Ergibt: \input{\jobname-1.tex}
\end{document}
Das betrifft dann auch noch ein paar andere Sonderzeichen im Bereich von US-ASCII wie `$`, `#` etc.
Einfacher ist die Verwendung von `xelatex` oder `lualatex`:
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{fontspec}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
A;B;C
1;2;3
4;5;6
\end{filecontents*}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{daten}{test.csv}
\usepackage{verbatim}
\newwrite\texfile
\makeatletter
\newcommand\writetexfile[2]{%
\immediate\openout\texfile #1
\immediate\write\texfile{#2}%
\immediate\closeout\texfile
}
\makeatother
\newcounter{texfile}
\newcommand\writenotexfile[1]{%
\stepcounter{texfile}%
\writetexfile{\jobname-\thetexfile.tex}{#1}%
}
\begin{document}
\DTLforeach*{daten}{
\A=A,%
\B=B,%
\C=C%
}{%
\writenotexfile{%
Text mit Umlauten Ä Ö Ü
}%
}
\verbatiminput{\jobname-1.tex}
Ergibt: \input{\jobname-1.tex}
\end{document}
![xelatex und Umlaute][1]
Da die beiden Maschinen XeTeX und LuaTeX UTF8 nativ verarbeiten, sind Umlaute und andere Sonderzeichen außerhalb UTF8 in der Regel keine Befehle mehr und zerbrechen deshalb beim Schreiben in Dateien auch nicht. Das könnte also ein guter Grund sein, mal wieder darüber nachzudenken, eine der beiden moderneren Maschinen statt PDFTeX zu verwenden.verwenden.
[1]: http://texwelt.de/wissen/upfiles/test_20171120_080726.png