PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen



peethebee
30-10-2009, 19:48
Hallo,

Zeichenketten"variablen" bringen mich gerade zur Verzweiflung :(.
Ich will ein bisschen programmieren und mir die Parameter verschiedener Aufrufe meiner newcommand-Befehle speichern, um daraus am Ende eine Tabelle zu generieren.
Konkret hätte ich gerne oben eine Übersicht mit allen Punkten, die ein Übungsblatt enthält. Unten rufe ich etwas in der Art von
\aufgabe[10]{"Überschrift"} auf, wobei die Zahl die Punkte darstellt.

Was ich rausgefunden habe, ist, dass ich "Variablen" so konkatenieren kann:


\newsavebox{\tablePoints}
\sbox{\tableItems}{a}
\sbox{\tableItems}{\usebox{\tableItems} b}
und dann mit

\usebox{\tableItems}
aufrufen kann.

Allerdings erscheinen per \& eingebundene Tabellenzellentrenner dann auch wirklich als kaufmännisches Und. Das wäre meine erste Frage, wie ich da ein erneutes Interpretieren der Sonderzeichen auslösen kann.

Außerdem brauche ich wohl die Möglichkeit, in eine temporäre Datei zu schreiben, damit ich beim nächsten Durchlauf oben die Punktetabelle bauen kann aus den hinterlegten Daten...

Minimalbeispielsversuch:

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{ifthen}

% counter stuff
\newcounter{points}
\setcounter{points}{0}
\newsavebox{\tableDef}
\newsavebox{\tableItems}
\newsavebox{\tablePoints}
\sbox{\tableDef}{}
\sbox{\tableItems}{}
\sbox{\tablePoints}{}

\newcommand{\aufgabe}[2][\empty]
{Aufgabe #2

}
\ifthenelse{\equal{#1}{\empty}}
{}% ein Parameter
{\marginpar{#1 P} % Seitenangabe
\sbox{\tableDef}{\usebox{\tableDef} |c \& } % Tabelle bauen
\sbox{\tableItems}{\usebox{\tableItems} #2 \& } % Tabelle bauen
\sbox{\tablePoints}{\usebox{\tablePoints} #1 \& } % Tabelle bauen
\addtocounter{points}{#1} % Gesamtsumme
} % zwei Parameter, Punkte angegeben
}

\begin{document}

\begin{center}
\begin{tabular}{|l|\usebox{\tableDef}||c|}
\hline
\textbf{Aufgabe} & \usebox{\tableItems} \textbf{Summe} \\
\hline
\textbf{Punkte} & \usebox{\tablePoints} \arabic{points} \\
\hline
\end{tabular}
\end{center}

\aufgabe[10]{A1}
\aufgabe[20]{A2}
\aufgabe[30]{A3}

\end{document}

Hat jemand Input für mich? :)
peethebee

krihaa
31-10-2009, 05:41
Hi,

ich könnte mit Folgendem dienen, weiß aber nicht ob das ein guter Stil ist. Dazu müssten sich dann die Experten mal äußern. Wäre auch selbst daran interessiert.

Die in wahren Orgien verwendeten expandafter erlauben das Definieren von Macros in deren Argument das Macro selbst wieder auftaucht. Damit kann man z.B. allen Aufgabennummern aneinanderreihen, in dem man die neueste einfach an die schon vorhandenen Nummern hinten anhängt. Ob man das so benutzen muss oder ob es andere (einfachere) Wege gibt, kann ich nicht sagen. Mit \savebox habe ich es jedenfalls nicht geschafft.

Um die Tabelle vor die Aufgaben zu bekommen, habe ich innerhalb des aufgabe-Befehls einen Befehl printaufgaben erstellt. In dem werden Überschriften, Text und ggf. die Punktzahl gespeichert, aber noch nicht ausgegeben. Die notwendigen Inhalte für die Tabelle werden mittels der expandafter-Geschichten erstellt und dann in die Tabelle eingefügt, die als erstes gedruckt wird. Danach wird \printaufgaben aufgerufen und die Aufgaben ausgegeben.

Hoffe es ist einigermaßen klar geworden, was ich mir gedacht und gemacht habe. Falls nicht einfach fragen.

Gruß
Kristian

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{ifthen}

% counter and definitions
\newcounter{points}
\setcounter{points}{0}
\def\tableDef{}
\def\tableItems{}
\def\tablePoints{}
\def\printaufgaben{}

\newcommand{\aufgabe}[3][]{%

\ifthenelse{\equal{#1}{}}% Punkte ja/nein

{% ein Parameter, keine Punkte angegeben
\expandafter\def\expandafter\printaufgaben\expanda fter{%
\printaufgaben \section{#2}#3}%
}% ein Parameter

{% zwei Parameter, Punkte angegeben
\expandafter\def\expandafter\printaufgaben\expanda fter{%
\printaufgaben \section{#2}%
\marginpar{#1 P}% Punkte
#3}%
\expandafter\def\expandafter\tableDef\expandafter{ \tableDef |c}%
\expandafter\def\expandafter\tableItems\expandafte r{\tableItems #2 &}%
\expandafter\def\expandafter\tablePoints\expandaft er{\tablePoints #1 &}%
\addtocounter{points}{#1}% Gesamtpunkte
}% zwei Parameter

}

% Aufgaben definieren
\aufgabe[10]{A1}{Aufgabentext1}
\aufgabe{A2}{Aufgabentext2}
\aufgabe[30]{A3}{Aufgabentext3}

\begin{document}

% Punktetabelle ausgeben
\begin{center}
\begin{tabular}{|l|\tableDef||c|}
\hline
\textbf{Aufgabe} & \tableItems \textbf{Summe} \\
\hline
\textbf{Punkte} & \tablePoints \arabic{points} \\
\hline
\end{tabular}
\end{center}

% Aufgaben ausgeben
\printaufgaben

\end{document}

voss
31-10-2009, 09:29
Was ich rausgefunden habe, ist, dass ich "Variablen" so konkatenieren kann:


http://texnik.dante.de/cgi-bin/mainFAQ.cgi?file=table/table#dynamical

da siehst du, wie man eine Tabelle dynamisch zusammenbauen kann.

Herbert