Ich spiele gerade mit dem Gedanken, wie man möglichst einfach eine große Menge an Übungsaufgaben des gleichen Typs inklusive Musterlösungen für studentische Zwecke erstellen kann. Dafür habe ich mir bisher folgendes überlegt:

Öffne in Overleaf
\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}

\begin{document}

\DTLforeach*{namelist}{
\PunktA=PunktA,%
\PunktB=PunktB,%
\PunktC=PunktC,%
\PunktD=PunktD,%
\VektorV=VektorV,%
\VektorW=VektorW%
}{Bestimmen Sie den Vektor $\overrightarrow{AB}$:
\[A(\PunktA,\PunktB),~B(\PunktC,\PunktD),~\overrightarrow{AB}=\begin{pmatrix} \VektorV \\ \VektorW\end{pmatrix}\]
}

\end{document}

Inhaltlich geht es zunächst einmal um analytische Geometrie, soll aber natürlich nicht nur darauf eingeschränkt bleiben. Die eingelesene csv-Datei würde aus einem Excelsheet kommen, PunktA bis PunktD entsprechen den Koordinaten von Punkten die variiert werden und per Formel werden dann die Einträge der notwendigen Vektoren für die Musterlösung berechnet.

Die Musterlösung soll letztendlich nicht als PDF vorliegen, sondern es wird sich um Onlineaufgaben handeln, welche die Studenten bearbeiten können und die automatisch ausgewertet und mit Musterlösung zurückgegeben werden. Ich kann in der Onlineumgebung direkt mit LaTeX arbeiten und hätte deshalb gerne, dass die einzelnen Durchläufe eine tex-Datei liefern; dann ist der Rest eine Copy-Paste-Tätigkeit. Die einzeln erstellen Dateien müssten auch nicht weiter kompiliert werden. Lässt sich das realisieren?

Anders gesagt: Ich hätte gerne die Tex-Datei von jedem Durchlauf, um diese weiter bearbeiten und kopieren zu können. Für das angefügt Beispiel hätte ich also gerne

Öffne in Overleaf
Bestimmen Sie den Vektor $\overrightarrow{AB}$:
\[A(0,1),~B(1,1),~\overrightarrow{AB}=\begin{pmatrix} 1 \\ 0 \end{pmatrix}\]

sowie

Öffne in Overleaf
Bestimmen Sie den Vektor $\overrightarrow{AB}$:
\[A(3,2),~B(-2,4),~\overrightarrow{AB}=\begin{pmatrix} -5 \\ 2 \end{pmatrix}\]

um diesen Code weiter bearbeiten und in ein anderes Dokument kopieren zu können.

Nachtrag: Lässt sich noch einstellen, dass Umlaute korrekt in die tex-Datei geschrieben werden?

Öffne in Overleaf
\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}

\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 Ä Ö Ü
}%
}

\end{document}

Dieses Beispiel liefert mir zwei Dateien mit Inhalt:

Öffne in Overleaf
Text mit Umlauten \protect \unhbox \voidb@x \bgroup \U@D 1ex{\setbox \z@ \hbox {\char 127}\dimen@ -.45ex\advance \dimen@ \ht \z@ \fontdimen 5\font \dimen@ }\accent 127\fontdimen 5\font \U@D A\egroup  \protect \unhbox \voidb@x \bgroup \U@D 1ex{\setbox \z@ \hbox {\char 127}\dimen@ -.45ex\advance \dimen@ \ht \z@ \fontdimen 5\font \dimen@ }\accent 127\fontdimen 5\font \U@D O\egroup  \protect \unhbox \voidb@x \bgroup \U@D 1ex{\setbox \z@ \hbox {\char 127}\dimen@ -.45ex\advance \dimen@ \ht \z@ \fontdimen 5\font \dimen@ }\accent 127\fontdimen 5\font \U@D U\egroup

gefragt 12 Nov, 06:17

Hirshy's gravatar image

Hirshy
441520
Akzeptiert: 87%

bearbeitet 20 Nov, 01:48

Beim letzten Absatz verstehe ich leider nur Bahnhof.

(12 Nov, 06:32) saputello

@saputello Ist es so verständlicher? :)

(12 Nov, 06:39) Hirshy

Und als was hättest Du das gern? Als eigene Datei? Wie man in eine Datei schreiben kann, hat Ijon Tichy Dir ja bereit gezeigt. Statt eine Skriptdatei zu schreiben, kann man natürlich auch eine TeX-Datei schreiben. Was man dabei nicht mit \string (oder teilweise \protect) vor der Expansion schützt oder robust definiert ist, wird expandiert.

(12 Nov, 07:31) saputello

Die Antwort hatte ich bis eben noch nicht gelesen, ich werde mir beides sobald es geht angucken, danke!

(12 Nov, 09:58) Hirshy

So wie ich bereits in meiner Antwort zur Aufteilung einer PDF-Datei in mehrere gezeigt habe, wie man eine Skriptdatei schreiben kann, kann man natürlich auch für jeden Datenbankeintrag eine eigene TeX-Datei erzeugen:

Öffne in Overleaf
\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:

Öffne in Overleaf
\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:

Öffne in Overleaf
\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:

Öffne in Overleaf
\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:

Öffne in Overleaf
\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

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.

Permanenter link

beantwortet 12 Nov, 07:52

Ijon%20Tichy's gravatar image

Ijon Tichy
5.8k1919

bearbeitet 20 Nov, 02:23

Ich werde es mir noch genauer ansehen müssen, aber das sieht so aus, als würde es genau das liefern, was ich brauche, danke!

(14 Nov, 02:54) Hirshy

Ich bin auf ein Problem gestoßen: ich verwende das ifthen-package und habe diverse Abfragen definiert die ich verwenden will. Das führt zu Fehlermeldungen "Incomplete iffalse" und "Forbidden control sequence found while scanning text of write". Lassen sich ifthenelse-Abfragen gar nicht damit verwenden oder kann man das entsprechend abändern? (Ich kann auch gerne eine neue Frage inklusive MWE erstellen wenn das Problem so noch nicht nachvollziehbar ist, Kommentarbox ist dafür aber zu klein...)

(15 Nov, 08:50) Hirshy
1

ifthen bereitet im Zusammenhang mit Expansion häufig Probleme. Auch wenn mir also sämtliche Infos fehlen, was Du da konkret probiert hast: Probier es besser entweder mit etoolbox oder mit expl3.

(15 Nov, 11:34) saputello

Alles klar, ich sehe es mir damit mal an und melde mich sonst mit einer neuen Frage!

(15 Nov, 11:46) Hirshy

@saputello @Ijon Tichy, nach Anpassung der Abfragen auf etoolbox tauchen die Fehler nicht auf, alles läuft butterweich durch!

(16 Nov, 05:29) Hirshy

Eine weitere Sache die mir aufgefallen ist: können Umlaute in die tex-Datei geschrieben werden? (Siehe aktualisierte Frage mit neuem MWE)

(20 Nov, 01:49) Hirshy

@Hirshy Eigentlich ist das wieder eine neue Frage: »Wie schreibe ich Umlaute in Dateien?« Mit datatool hat das ja nur sehr am Rande zu tun. Bitte gewöhne Dich daran, lieber mehrere kleine Fragen zu stellen als Fragen weiter und weiter zu entwickeln. Für andere Hilfesuchende ist das in der Regel nützlicher und überschaubarer.

(20 Nov, 02:21) Ijon Tichy

Ok, danke! Ich hatte gedacht, da es direkt mit dieser Frage zu tun hat, würde ich das entsprechend hier verorten, beim nächsten Mal erstelle ich dann aber eine neue.

(20 Nov, 08:53) Hirshy

@Hirshy Prima! Wir haben Platz für Millionen Fragen. ;-) Einzelfragen sind besser archivierbar mit Themen-Einordnung und passender Titelzeile (gut per google auffindbar) und am Ende ist das hier ja, neben dem Support, ein Lösungs-Archiv auf Basis von tausenden Fragen, wo die Antworten sehr flach direkt auffindbar sind, im Gegensatz zu klassischen langen Foren-Threads.

(20 Nov, 09:07) stefan ♦♦
Ergebnis 5 von 9 Alle anzeigen
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×14

Frage gestellt: 12 Nov, 06:17

Frage wurde angeschaut: 211 Mal

Zuletzt aktualisiert: 20 Nov, 09:08