Seite 1 von 1
Struktur-Problem
Verfasst: So 26. Jun 2011, 16:39
von projoe
Ich habe in einem längeren Dokument eine Vielzahl von Aufgaben und will im Anhang die Lösungen haben. Natürlich kann ich mit label darauf referenzieren, aber das ist unkomfortabel. Ich will schreiben können \ag{Geben Sie $\pi$ auf zwei Dezimalen an}{3.14} und dann soll im Text die Aufgabe erscheinen und in einem späteren Kapitel Lösungen dann 3.14
Das hat den Vorteil, dass wenn ich Aufgaben austausche, dann muss ich nur an einer Stelle im tex-File ändern und nicht an zwei. Außerdem nerven 1000 Referenzen.
Geht das, oder widerspricht das der LaTeX-Philosophie?
Verfasst: So 26. Jun 2011, 17:06
von iTob
Das geht. Es gibt diverse Pakete dazu (examen ist eins davon glaube ich) Ich habe auch grad eins dafür in der mache, das ist aber lange nicht so, dass man es benutzen könnte.
Der Philosophie widerspricht es nicht.
Siehe auch den
TeX Catalogue
Verfasst: So 26. Jun 2011, 21:19
von projoe
Also es gibt ein Paket exam. Da bekomme ich dann Befehle für Multiple Choice, Lücken für Antworttext usw. Das brauche ich alles nicht. Und ich muss eine eigene documentclass benutzen, will aber article.
Das scheint mir nicht das zu sein, was ich suche.
Ich will Passagen im tex-File verteilt schreiben, die beim compilieren nur aufgesammelt werden und dann am Ende mit einem Befehl ausgegeben werden können. Mir scheint der Befehl
\def\textstring{Hello}
blabla
\edef\textstring{\textstring{}
world
}
in die richtige Richtung zu gehen. Dann kann ich später mit \textstring alles ausgeben. Aber dann kann ich nicht {\bf world} machen und auch nicht \begin{array} ...\end{array} und solche Sachen.
Was ist die Lösung?
Verfasst: So 26. Jun 2011, 23:46
von iTob
Du könntest auch alles in eine (Hilfs-)Datei schreiben und diese dann am Ende auslesen. Schau mal
hier zum Beispiel. Ansonsten ist auch Google mit „latex write file“ o. ä. dein Freund.
Hilft dir das?
Der Ansatz wäre also ein eigener Befehl mit zwei Argumenten. Das erste wird einfach ausgegeben, das zweite wird mit \write<Dateibefehl>{Text} in eine externe Datei* geschrieben, die am Ende des Dokuments mit \input{<Dateiname mit Endung>} wieder eingelesen und ausgeben werden kann.
Es wundert mich allerdings, dass es defür kein Paket gibt …
________
* Kleiner Hinweis für die Dateinamen:
Die Hilfsdateien, die TeX so erstellt, haben ja immer den gleichen Namen, wie die Hauptdatei und werden anhand ihrer Endung (tex, toc, aux, log, …) unterschieden, das würde ich dann auch hier vorschlagen. An den namen der Datei ohne Endung kommst du mit \jobname und die Endung kannst du dir ausdenken.
Man könnte den Namen beispielsweise als \jobname.ant definieren. Wie die Endung lautet, ist egal sie muss nur eindeutig sein (\jobname.aux wäre also keine gute Idee, weil dann die TeX-eigne Hilfsdatei überschrieben würde).
Verfasst: Mo 27. Jun 2011, 16:27
von projoe
Vielen Dank für die Antwort, das ist das, was ich suche.
Nur klappt es noch nicht so ganz. In das File wird irgendwas kryptisches geschrieben.
Z.B.
\documentclass[german]{article}
\newwrite\tempfile
\newcounter{AgNummer} \setcounter{AgNummer}{1}
\newcommand{\Aufgabe}[2]
{ {\bf Ag \arabic{AgNummer}:} #1
\immediate\write\tempfile{{\bf Ag \arabic{AgNummer}:} #2}
\stepcounter{AgNummer}
}
\newwrite\tempfile
\begin{document}
\immediate\openout\tempfile=lists.tex
\Aufgabe{Geben Sie pi auf zwei Dezimalen genau an.}{{\bf Lösung} $\frac{3.14}{1}$}
\immediate\closeout\tempfile
Lösungen der Aufgaben:
%\input{lists}
\end{document}
Und ist ja auch irgendwie klar, dass z.B. der Befehl \arabic{AgNummer} in der Definition von \Aufgabe unlogisch ist: Will ich, dass da Zeichen für Zeichen \arabic{AgNummer} steht oder will ich, dass die Zahl reingeschrieben wird.
Wie kann ich dafür sorgen, dass genau meine angegebenen Zeichen im File landen?
Wie kann ich dafür sorgen, dass z.B. der Ausdruck \arabic{AgNummer} ausgewertet wird und das dann ins File geschrieben wird.
Verstehst du, was ich meine? Leider bin ich aus den Google-Treffern nicht so schlau geworden, hab's echt probiert.
Verfasst: Mo 27. Jun 2011, 19:37
von iTob
Ist auch nicht so einfach, wie ich feststellen musste …
Das Problem ist, das \write seinen Inhalt vollständig expandiren will, was nicht unbedingt geht, deswegen muss man einige Makros mit \string schützen. Damit die Antwort auch unexpandiert in die Datei geschrieben wird, verwende ich \unexpanded{}.
Damit sollte es gehen.
\documentclass[german]{article}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}% nur zum Testen
\newwrite\tempfile
\immediate\openout\tempfile=\jobname.lsg
\newcounter{AgNummer} \setcounter{AgNummer}{1}
\newcommand{\Loesungen}{%
\immediate\closeout\tempfile
\section*{Lösungen}
\input{\jobname.lsg}
}
\makeatletter
\newcommand{\Aufgabe}[2]{%
\textbf{Ag \arabic{AgNummer}:} #1
\immediate\write\tempfile{%
\string\par\string\noindent%
\string\textbf{Ag \arabic{AgNummer} (Lsg.):}
\unexpanded{#2} %
}
\stepcounter{AgNummer}
}
\makeatother
%\newwrite\tempfile% ist doch oben schon ;-)
\begin{document}
\Aufgabe{Geben Sie $\pi$ auf zwei Dezimalen genau an.}{$\pi\approx3.14$}
\Aufgabe{Wie lautet die 2. binomische Formel?}{%
Die zweite binomische Formel lautet
\begin{equation*}
(a+b)^2 = a^2 +2ab +b^2.
\end{equation*}
}
\Aufgabe{%
Lösen Sie das Integral
\begin{equation*}
\int_0^1 x^2 \mathrm{d}x.
\end{equation*}%
}{%
\begin{align*}
\int_0^1 x^2 \mathrm{d}x &= \left. \frac{1}{2}x^2\right|_0^1\\
&= \frac{1^2}{2}-\frac{0^2}{2}\\
&= \frac{1}{2}
\end{align*}
}
\Loesungen
\end{document}
Übrigens sollte man {\bf Text} mit LaTeX nicht Benutzen (Sihe l2tabu.pdf)!
Viele Grüße
Tobi
Verfasst: Di 28. Jun 2011, 08:25
von projoe
Super, jetzt läuft alles einwandfrei. Danke.
Redundant
Verfasst: Di 28. Jun 2011, 18:07
von localghost
Schön hin gebastelt. Aber warum das Rad neu erfinden? Für so etwas gibt es doch
exercise oder
probsoln.
Thorsten
Verfasst: Mi 29. Jun 2011, 11:01
von iTob
Wusste ich doch, das es da Pakete gibt. Hab’ ich auch gesagt und bin dann davon ausgegangen, dass der Frage erstmal recherchiert …
