Anzeige:
Ergebnis 1 bis 12 von 12

Thema: Erwartungshorizont schreiben mit \def \csname \expandafter

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.09.2012
    Beiträge
    5

    Erwartungshorizont schreiben mit \def \csname \expandafter

    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:

    Code:
    \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.

  2. #2
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    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.

    Grüße
    Clemens

  3. #3
    Registrierter Benutzer
    Registriert seit
    03.05.2010
    Beiträge
    84
    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:
    Code:
    \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.

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.09.2012
    Beiträge
    5

    Genau!!!

    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!

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.09.2012
    Beiträge
    5
    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.):
    Code:
    \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
    Code:
    {\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 :
    Code:
    \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
    Code:
    {#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
    Geändert von littlemath (23-09-2012 um 08:01 Uhr)

  6. #6
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Moin moin,
    Zitat Zitat von littlemath Beitrag anzeigen
    (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.
    Zitat Zitat von littlemath Beitrag anzeigen
    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...
    Zitat Zitat von littlemath Beitrag anzeigen
    Code:
    \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
    Code:
    \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?
    Zitat Zitat von littlemath Beitrag anzeigen
    Code:
    \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.
    Zitat Zitat von littlemath Beitrag anzeigen
    Code:
    \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:
    Code:
    \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}}{\alph{Teilaufgabe}}{\arabic{Bepunktungsteil}}{Kommentartext}{\arabic{Teilpunkte}}
    
    \csname Erwzeile1b3\endcsname
    
    oder einfach \Erwzeile{1}{b}{3}
    \end{document}
    MfG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.09.2012
    Beiträge
    5
    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.

    Code:
    \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}}{\alph{Teilaufgabe}{\arabic{Bepunktungsteil}}{Kommentartext1}{\arabic{Teilpunkte}}
    
    %%%%% zweiter Durchlauf
    \setcounter{Aufgabe}{2}
    \setcounter{Teilaufgabe}{3}
    \setcounter{Bepunktungsteil}{4}
    \setcounter{Teilpunkte}{4}
    
    
    \Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alph{Teilaufgabe}}{\arabic{Bepunktungsteil}}{Kommentartext2}{\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

  8. #8
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    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.

    Code:
    \newcommand{\Erwartungshorizontzeiledef}[5]{%
      \expandafter\edef\csname Erwzeile#1#2#3\endcsname{%
         #1 #2  Teil #3  #4  #5%
      }%
    }
    Grüße
    Clemens

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Code:
    \Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alph{Teilaufgabe}{\arabic{Bepunktungsteil}}{Kommentartext1}{\arabic{Teilpunkte}}
    Warum definierst du deinen Befehl nicht so, dass du ihn nur so aufrufen musst:

    Code:
    \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}

  10. #10
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Das folgende ist vielleicht nicht ganz, was Du Dir vorstellt, einen Hinweis ist es aber vielleicht doch wert:

    Code:
    \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.



    Grüße
    Geändert von cgnieder (08-10-2012 um 21:39 Uhr)
    Clemens

  11. #11
    Registrierter Benutzer
    Registriert seit
    19.09.2012
    Beiträge
    5
    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:
    Code:
    \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):

    Code:
    \stepcounter{Bepunktungsteil} \Erwartungshorizontzeiledef{\arabic{Aufgabe}}{\alph{Teilaufgabe}}{\arabic{Bepunktungsteil}}{%
    Distributivgesetz linker Summand %
    }{\arabic{Teilpunkte},\arabic{angezeigtehalbeTeilpunkte}}
    Ansonsten ist das jetzt eine tolle Sache geworden. Danke

  12. #12
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    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
    Clemens

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •