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 '17, 12:17 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 Es sei darauf hingewiesen, dass bei Verwendung von Ö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 Ö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 Ö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 Einfacher ist die Verwendung von Ö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} 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. beantwortet 12 Nov '17, 13:52 gast3 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 '17, 08: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 '17, 14:50)
Hirshy
1
(15 Nov '17, 17:34)
saputello
Alles klar, ich sehe es mir damit mal an und melde mich sonst mit einer neuen Frage!
(15 Nov '17, 17:46)
Hirshy
@saputello @Ijon Tichy, nach Anpassung der Abfragen auf etoolbox tauchen die Fehler nicht auf, alles läuft butterweich durch!
(16 Nov '17, 11: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 '17, 07: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 '17, 08:21)
gast3
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 '17, 14: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 '17, 15:07)
stefan ♦♦
Ergebnis 5 von 9
show 4 more comments
|
Beim letzten Absatz verstehe ich leider nur Bahnhof.
@saputello Ist es so verständlicher? :)
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.Die Antwort hatte ich bis eben noch nicht gelesen, ich werde mir beides sobald es geht angucken, danke!