PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erwartungshorizont schreiben mit \def \csname \expandafter



littlemath
19-09-2012, 23:20
Hallo.

Ich habe die Schule gewechselt und muß jetzt zu den von mir gestellten Klausuren detaillierte Punkteverteilungen mit Beschreibungen der Einzelaufgaben erstellen. Daher versuche ich gerade, meine Klausurvorlagen so umzuschreiben, daß dieser Punkteschlüssel oder auch Erwartungshorizont gleich mitgeschrieben wird.
Dazu wollte ich pro Teilaufgabe (z.B. "2c") mehrere Befehle definieren, etwa mit /newcommand, welche ich am Ende wieder aufsammeln und auflisten könnte - zu einem Erwartungshorizont.
Ein solcher Befehl sollte z. B. eine vierpaltige Zeile (mit \multicols) ausgeben mit der Aufgabennummer, dem Bepunktungsteil und einer Beschreibung des Teils.

Leider muß der Befehl aber immer neu definiert werden und daher immer automatisch einen neuen Namen bekommen.

Und leider steige ich durch \def , \csname und \expandafter nicht durch und weiß nicht, wie man dynamische Befehlsnamen erstellt.
Hier die Variablen und wie sie voneinander abhängen:


\newcounter{Aufgabe} \setcounter{Aufgabe}{0} \newcounter{Teilaufgabe}[Aufgabe] \newcounter{Bepunktungsteil}[Teilaufgabe] \newcounter{Teilpunkte}

Die und der Kommentar müßten enthalten sein und am Ende des Dokumentes im Befehl abrufbar bleiben. Ich lasse mich auch gerne auf BibteX ein, wenn das sinnvoll ist. Oder vielleicht konnte mir jemand auch einfach dies hier erklären: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=csname


Vielen Dank.

cgnieder
19-09-2012, 23:45
Kannst Du etwas konkreter werden? Vielleicht ein Beispiel für einen Befehl wie Du ihn Dir vorstellst? Oder welche Syntax und konkrete Verwendung Dir vorschwebt? Am besten in einem Minimalbeispiel (http://www.minimalbeispiel.de/mini.html).

Grüße

strolch
20-09-2012, 00:07
es waere vielleicht eine möglichkeit die zusaetzlichen informationen in einer liste zwischenzuspeichern und am ende es dokuments auszugeben. das stichwort heißt dabei "listen mit float-package".

so in der art:


\documentclass[a4paper,12pt,ngerman,liststotoc]{scrbook}

\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{float}

\newfloat{tmpListe}{H}{list}
\newcommand{\speicherinliste}[3]{\addcontentsline{list}{tmpListe}{Aufgabe #1: #2 Punkte; Beschreibung:#3}}


%nummer, punkte, Beschreibung
\newcommand{\Aufgabe}[3]{%
\textbf{Aufgabe #1}\\%
\speicherinliste{#1}{#2}{#3}%
}

\begin{document}

\Aufgabe{1}{6}{Test A}
1+1=?

\Aufgabe{2}{5}{Test B}
2+2=?

\Aufgabe{3}{4}{Test C}
1*x=42

%liste ausgaben
\listof{tmpListe}{Erwartungshorizont:}

\end{document}


erfordert zwei pdflatex durchlaeufe, da beim ersten durchlauf die liste erst gefuellt wird und beim zweiten eingefuegt wird.

man muesste sich "nur" noch was mit der formatierung der ausgegebenen liste ueberlegen.

littlemath
20-09-2012, 21:19
Vielen Dank!

Ich glaube das mit der Liste ist ganz genau das Richtige. Ich bekomme schon Ideen, was ich noch alles machen könnte. Das Paket kannte ich noch nicht.

Danke an Euch beide!

littlemath
23-09-2012, 07:49
Hallo nochmals. Das mit der Liste klappt bei mir leider doch noch nicht. Auch das Beispiel gibt keine Liste aus. Vielleicht liegt das an dem \addcontentsline , welches vielleicht nicht für beliebige selbstdefinierte floats funktioniert. (Was bedeutet das "liststotoc" im Header?)

Ich habe die Idee mit den Macros weiterverfolgt. Es geht um das Definieren eines Befehls zum Definieren von Befehlen, in deren Namen aktuelle Zählerstände auftreten. Hier ein Versuch ( ...verzeiht, dass ich kein richtiges Dokument reinsetze und nicht im Code kommentiere. Ich bin nicht mehr in Übung und glaube, es sind evtl. nur kleine Syntax -oder Numerierungsfehler.):

\newcommand{\Erwartungshorizontzeiledef}[5]{%
\expandafter\newcommand \csname {\Erwzeile#1#2#3} \endcsname [5]{%
#1 #2 Teil #3 #4 #5 }%
}%
}

\Erwartungshorizontzeiledef{\arabic{Aufgabe} }{\alph{Teilaufgabe} }{\arabic{Bepunktungsteil} }{Kommentartext }{\arabic{Teilpunkte} }

\Erwzeile1a1{\arabic{Aufgabe} }{\alph{Teilaufgabe} }{\arabic{Bepunktungsteil} }{\arabic{Teilpunkte} }{\arabic{Teilpunkte} }

\Erwartungshorizontzeiledef soll hierbei einen Befehl definieren, in dessen Namen bereits die Variablen #1#2#3 stehen, also
{\arabic{Aufgabe} }{\alph{Teilaufgabe} }{\arabic{Bepunktungsteil} }

Für dieses Anpassen des Namens des Befehls an drei Zähler braucht man nach meiner Information das Spiel mit \expandafter und \csname :

\expandafter\newcommand \csname {\Erwzeile#1#2#3} \endcsname

Dann sollen alle 5 Variablen noch mal in der z. B. von \Erwzeile1a1 definierten Zeichenfolge erscheinen. Das ist der letzte Teil

{#1 #2 Teil #3 #4 #5 }

Hier sind noch ein paar andere Probleme drin, etwa dass die Zeilenbefehle am Ende des Dokuments aufgerufen werden, aber die historischen Zählerstände von weit oben bräuchten. Aber jetzt interessiert mich zunächst nur, wie ich in den Namen eines definierten Befehls drei Zählerstände integrieren kann, so daß jedesmal ein neuer, identifizierbarer Befehl mit \newcommand definiert wird.

Vielen Dank

rais
23-09-2012, 09:02
Moin moin,

(Was bedeutet das "liststotoc" im Header?)

schau in Deiner .log-Datei nach `liststotoc', eine halbwegs aktuelle Koma-Script-Version sollte eine Warnung ausgeben. Siehe auch `texdoc scrguide', falls Du mit dem `listof=totoc' auch nichts anzufangen weißt.


Hier ein Versuch ( ...verzeiht, dass ich kein richtiges Dokument reinsetze und nicht im Code kommentiere. Ich bin nicht mehr in Übung und glaube, es sind evtl. nur kleine Syntax -oder Numerierungsfehler.):

Nun ja, gerade solche Probleme ließen sich anhand eines Minimalbeispiels zumindest woanders testen, ohne erst den Code entsprechend erweitern zu müssen...



\newcommand{\Erwartungshorizontzeiledef}[5]{%
\expandafter\newcommand \csname {\Erwzeile#1#2#3} \endcsname [5]{%
#1 #2 Teil #3 #4 #5 }%
}%
}

\csname..\endcsname sorgt selbst für einen Backslash, also etwa


\csname Erwzeile#1#2#3\endcsname

Und Du hast eine schließende Klammer zu viel.
Wozu willst Du das Teil fünf Parameter einsammeln lassen, mit denen es dann doch nichts macht?




\Erwartungshorizontzeiledef{\arabic{Aufgabe} }{\alph{Teilaufgabe} }{\arabic{Bepunktungsteil} }{Kommentartext }{\arabic{Teilpunkte} }

Ich halte es für keine gute Idee, hier in den ersten drei Parametern Leerzeichen mit übergeben zu wollen.



\Erwzeile1a1{\arabic{Aufgabe} }{\alph{Teilaufgabe} }{\arabic{Bepunktungsteil} }{\arabic{Teilpunkte} }{\arabic{Teilpunkte} }

Bloß weil Du mit \csname/\endcsname einen Befehl definieren kannst, heißt das nicht, daß Du plötzlich etwas anderes als Buchstaben in Befehlsnamen direkt verwenden kannst.
Zum Vergleich:


\documentclass{article}
\newcounter{Aufgabe}
\newcounter{Teilaufgabe}[Aufgabe]
\newcounter{Bepunktungsteil}
\newcounter{Teilpunkte}
\renewcommand*\theTeilaufgabe{\alph{Teilaufgabe}}

\newcommand{\Erwartungshorizontzeiledef}[5]{%
\expandafter\newcommand \csname Erwzeile#1#2#3\endcsname {%
#1 #2 Teil #3 #4 #5%
}%
}
\newcommand*\Erwzeile[3]{%
\csname Erwzeile#1#2#3\endcsname
}
\begin{document}
\setcounter{Aufgabe}{1}
\setcounter{Teilaufgabe}{2}
\setcounter{Bepunktungsteil}{3}
\setcounter{Teilpunkte}{4}

\Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alp h{Teilaufgabe}}{\arabic{Bepunktungsteil}}{Kommenta rtext}{\arabic{Teilpunkte}}

\csname Erwzeile1b3\endcsname

oder einfach \Erwzeile{1}{b}{3}
\end{document}

MfG

littlemath
23-09-2012, 12:37
Lieber Rainer, vielen Dank für die Mühe. Ich komme der Sache schon näher. Naja, Du merkst, daß ich nur alle halbe Jahre mal an die Dokumentvorlage ran muß und eben aus der Übung bin. Jetzt werden tatsächlich zwei Befehle verschiedenen Namens ausgegeben. Leider werden bei mehrfachem Durchlauf nur die letzten Zählerwerte übernommen.


\documentclass{article}
\newcounter{Aufgabe}
\newcounter{Teilaufgabe}[Aufgabe]
\newcounter{Bepunktungsteil}
\newcounter{Teilpunkte}
% \renewcommand*\theTeilaufgabe{\alph{Teilaufgabe}}



\newcommand{\Erwartungshorizontzeiledef}[5]{%
\expandafter\newcommand \csname Erwzeile#1#2#3\endcsname {%
#1 #2 Teil #3 #4 #5%
}%
}

\newcommand*\Erwzeile[3]{\csname Erwzeile#1#2#3\endcsname}

\begin{document}


%%%%% erster Durchlauf
\setcounter{Aufgabe}{1}
\setcounter{Teilaufgabe}{2}
\setcounter{Bepunktungsteil}{3}
\setcounter{Teilpunkte}{4}


\Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alp h{Teilaufgabe}{\arabic{Bepunktungsteil}}{Kommentar text1}{\arabic{Teilpunkte}}

%%%%% zweiter Durchlauf
\setcounter{Aufgabe}{2}
\setcounter{Teilaufgabe}{3}
\setcounter{Bepunktungsteil}{4}
\setcounter{Teilpunkte}{4}


\Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alp h{Teilaufgabe}}{\arabic{Bepunktungsteil}}{Kommenta rtext2}{\arabic{Teilpunkte}}

%%%%%%%%%%%%%%% Dies ist der Tester:
\csname Erwzeile1b3\endcsname
\ oder einfach \Erwzeile{1}{b}{3}

\csname Erwzeile2c4\endcsname
\ oder einfach \Erwzeile{2}{c}{4}

\end{document}

Ich müßte innerhalb von \Erwartungshorizontzeiledef also momentane Fotografien der Zählerstände verwenden, oder? Danke

cgnieder
23-09-2012, 12:45
Verwende \edef in der Definition von \Erwartungshorizontzeiledef. Das bedeutet allerdings, dass manche Befehle wie z.B. \textbf ein \protect vorangestellt werden muss, wenn sie im Argument von \Erwartungshorizontzeiledef verwendet werden.


\newcommand{\Erwartungshorizontzeiledef}[5]{%
\expandafter\edef\csname Erwzeile#1#2#3\endcsname{%
#1 #2 Teil #3 #4 #5%
}%
}

Grüße

u_fischer
24-09-2012, 11:04
\Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alp h{Teilaufgabe}{\arabic{Bepunktungsteil}}{Kommentar text1}{\arabic{Teilpunkte}}

Warum definierst du deinen Befehl nicht so, dass du ihn nur so aufrufen musst:


\Erwartungshorizontzeiledef{Kommentartext1}

die anderen Argumente scheinen ja immer gleich zu sein. Befehle mit 5 Argumenten sind außerdem sowieso zweifelhaft. Wenn die wirklich alle nötig sind, solltest du besser ein keyval-Paket benutzen.

Ich halte es übrigens nicht für klug, Dinge wie \arabic{Aufgabe} in \csname zu benutzen. \arabic usw sind ziemlich komplizierte Befehle und wenn du Pech hast, definiert später irgendein Paket einen von ihnen so um, dass er nicht mehr expandierbar ist. Nimm lieber sowas wie \the\value{Aufgabe}

cgnieder
08-10-2012, 21:36
Das folgende ist vielleicht nicht ganz, was Du Dir vorstellt, einen Hinweis ist es aber vielleicht doch wert:


\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{libertine-type1,biolinum-type1,inconsolata}
\usepackage[german]{babel}

\usepackage{exsheets}
\SetupExSheets[points]{
name = Punkt/e ,
bonus-name = Bonuspunkt/e ,
}
\DeclareQuestionProperty{points}
\DeclareQuestionProperty{notes}
\DeclareQuestionProperty{reference}

\usepackage{ragged2e,booktabs,tabu}
\heavyrulewidth=1pt

\usepackage{csquotes}
\usepackage[backend=biber,style=alphabetic]{biblatex}
\addbibresource{biblatex-examples.bib}

\newcommand*\cs[1]{\texttt{\string#1}}
\newcommand*\env[1]{\texttt{#1}}

\begin{document}

\addsec{Aufgaben}
\begin{question}[ID=center]{3}
Wie kann man in einem \LaTeX-Dokument Text zentrieren?
\SetQuestionProperties{
points = 3,
notes = {Wie man Text zentriert.},
reference = {\textcite{companion}}}
\end{question}
\begin{solution}
Um einen kleinen Teil -- etwa einen Absatz -- zu zentrieren, kann man die
\env{center} Umgebung verwenden (\points{1}). Dabei ist zu beachten, dass ober-
und unterhalb ein Leerraum eingefügt wird. Innerhalb einer Umgebung
wie der Gleitumgebung \env{table} sollte man \cs{\centering} verwenden
(\points{1}). Für einzelne Zeilen gibt es auch den \cs{\centerline}
Befehl (\points{1}), der analog zu seinem plain\TeX-Vetter definiert ist.
\end{solution}

\begin{question}[ID=knuthbooks]{2}
Nennen Sie zwei Bücher von D.\,E.\,Knuth. Mit mehr korrekten Nennungen können
Sie bis zu \addbonus{2} erhalten.
\SetQuestionProperties{
points = 2+2,
notes = {Bücher von Knuth.},
reference = {\textcite{knuth:ct:a,knuth:ct:b,knuth:ct:c,knuth: ct:d,knuth:ct:e}}}
\end{question}
\begin{solution}
Zum Beispiel zwei Bücher der Reihe \citetitle{knuth:ct}:
\citetitle{knuth:ct:a,knuth:ct:b,knuth:ct:c,knuth: ct:d,knuth:ct:e}. Jede richtige
Antwort ist \points{1} wert, maximal kön\-nen \points{2} erreicht werden.
\end{solution}

\addsec{Lösungen}
\printsolutions

\addsec{Überblick}
Insgesamt können \totalpoints\ erreicht werden.

\bigskip\noindent
\begin{tabu}{X[1.5,c]X[2]X[9]}
\toprule\rowfont\bfseries
Aufgabe & Eigenschaft \\
\midrule
\QuestionNumber{center}
& Punkte & \GetQuestionProperty{points}{center} \\
& Stichwort & \GetQuestionProperty{notes}{center} \\
& Literatur & \GetQuestionProperty{reference}{center} \\
\midrule
\QuestionNumber{knuthbooks}
& Punkte & \GetQuestionProperty{points}{knuthbooks} \\
& Stichwort & \GetQuestionProperty{notes}{knuthbooks} \\
& Literatur & \GetQuestionProperty{reference}{knuthbooks} \\
\bottomrule
\end{tabu}

\RaggedRight\printbibliography
\end{document}

Das hier verwendete Paket exsheets ist in Kürze auf CTAN zu finden und jetzt schon hier (https://bitbucket.org/cgnieder/exsheets/).

http://www.mrunix.de/forums/attachment.php?attachmentid=5402&stc=1&d=1349724964

Grüße

littlemath
27-10-2012, 10:28
Vielen Dank.

Die erste Klassenarbeit ist mit dem Sheet geschrieben, die Aufgaben sind als Blöcke allereinfachst und im letzten Moment noch verschiebbar und werden automatisch durch umeriert, die Punkte und Zeiten werden zusammengezählt, und es sind sogar die Kommentarzeilen am Ende auflistbar, aufgerufen als eine Reihe von Befehlen \Erwazeile{Aufgabennummer}{Teilaufgabenbuchstabe}{ Bepunktingsteil}, die bei der Teilpunktevergabe automatisch definiert wurden:

% \Erwazeile{1}{a}{1} \\
% \Erwazeile{1}{b}{1} \\
% \Erwazeile{1}{c}{1} \\
% \Erwazeile{1}{c}{2} \\
\Erwazeile{2}{a}{1} \\
\Erwazeile{2}{a}{2} \\
\Erwazeile{2}{b}{1} \\
\Erwazeile{2}{b}{2} \\
\Erwazeile{2}{c}{1} \\
\Erwazeile{2}{c}{2} \\
\Erwazeile{2}{d}{1} \\
und so weiter.

Irgendwann möchte ich dann noch einen Befehl, der diese lange Liste von Befehlen ersetzt.

Wie man sieht,ist aber der Block zu Aufgabe eins auskommentiert. Denn diese Befehle versteht Monkeytex nicht:

l.! Emergency stop.
l.533 \Erwazeile{1}{a}{1} \\
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on eFOT86aCReboRE5L7T9OLj5oVIv6PMhm.log.

Ich habe mal versucht, den counter "Aufgabe" am Anfang nicht auf 0, sondern auf 1 zu stellen. Danach kommt wie üblich am Aufgabenanfang ein \stepcounter{Aufgabe}. Dann werden nicht mehr die Befehle mit der Eins, sondern die mit der Zwei am Anfang nicht verstanden bzw wurden nicht definiert.
Hat jemand eine Idee, woran das liegen könnte, daß nur die erste Runde von definierten Befehlen nicht geht?

Hier die Befehlsdefinition:

\newcommand{\Erwartungshorizontzeiledef}[5]{\expandafter\edef \csname Erwzeile#1#2#3\endcsname {#1 #2 Teil #3 #4 #5 P.}}
\newcommand*\Erwazeile[3]{\csname Erwzeile#1#2#3\endcsname}

und hier die Art, wie In einem solchen Bepunktungsteil diese Definition aufgerufen wird, wobei ich mal die Punktezählerei nicht übernommenhabe (die stepcounter zu Aufgabe und Teilaufgabe waren schon vorher):


\stepcounter{Bepunktungsteil} \Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alp h{Teilaufgabe}}{\arabic{Bepunktungsteil}}{%
Distributivgesetz linker Summand %
}{\arabic{Teilpunkte},\arabic{angezeigtehalbeTeilp unkte}}

Ansonsten ist das jetzt eine tolle Sache geworden. Danke

cgnieder
27-10-2012, 13:24
Wenn Du mal ein komplettes Minimalbeispiel erstellen würdest, könnte man Dir vielleicht einen Vorschlag geben, wie Du das ganze optimieren könntest und herausfinden, wo der Fehler herkommt.

Grüße