PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Über Counter iterieren?



Meta
25-08-2010, 00:05
Hallo zusammen,

ich schreibe immer noch an der Klasse zum Erstellen von Hörspielskripten.
In dem Zusammenhang möchte ich gerne eine Übersicht der Rollen und der jeweiligen Anzahl an Takes ausgeben.

Für die Takes habe ich eine eigene Umgebung geschrieben:


\newmarks\insidetake
\newcounter{takecounter}
\setcounter{takecounter}{1}
\newenvironment{take}[1]{%
\providecounter{#1}\stepcounter{#1}%
\minisec{\leadzeros{\thetakecounter}\quad\MakeUppe rcase{#1}\stepcounter{takecounter}\marks\insidetak e{true}}%
\addmargin[10mm]{15mm}%
}{%
\marks\insidetake{false}%
\endaddmargin%
}


Der Befehl \providecounter (definiert in moredefs) arbeitet wie \providecommand: falls nicht vorhanden, wird der Counter erzeugt, falls vorhanden, dann passiert nichts.
Jeder Take ein und der selben Rolle inkrementiert den entsprechenden Zähler.
Mein Problem ist nun: wie kann ich (am Ende oder weit besser noch am Anfang) über die Zähler iterieren und die Werte ausgeben?

Ich meine, die Takes haben als Argument ja lediglich den Namen der Rolle, also z.B.


\begin{take}{Erzaehler}
...
\end{take}


Ausgeben möchte ich aber eine vollständige Liste aller Rollen und deren Takeanzahl (sprich dem entsprechenden Zähler).

Das Abbildungsverzeichnis oder ähnliches zu missbrauchen, also \addcontentsline{lof}{...}, macht ja auch nicht viel Sinn, denn ich möchte für die Rolle Erzaehler beispielsweise ja auch nur einen Eintrag und nicht für jeden Take einen neuen LoF-Eintrag und so...

Weiß jemand Rat?
Wahlweise als Verbesserung meiner Herangehensweise oder aber sehr gerne auch in Form eines neuen Vorschlags, wie ich das Problem umgehen kann.
Kann man über die selbst erzeugten Counter iterieren (und dann am besten auch welche ausschließen)?
Sollte ich das komplett anders angehen?
Ist mein Vorhaben vielleicht nicht umsetzbar?

FALLS das mit dem Iterieren irgendwie geht, dann könnte ich ja doch z.B. die LoF verwenden und die Rollen samt ihrer Takeanzahlen reinschreiben...

Ich hoffe, dass klar geworden ist, was ich machen möchte!? :)

Vielen Dank schon mal im Voraus!

Grüße
Meta

u_fischer
25-08-2010, 10:39
Du solltest dir schon die Mühe geben und bei derartigen Fragenein Rumpfdokument zum Rumprobieren mitgeben. Wenn du die Rollen auch noch sortieren willst, solltest du dir z.B. glossaries anschauen.


\documentclass[parskip]{scrartcl}
\usepackage{moredefs}
\makeatletter
\newenvironment{take}[1]{%
\minisec{Take #1}
\providecounter{#1}%
\stepcounter{#1}%
\ifcsname takename#1\endcsname
\else
\expandafter\gdef\csname takename#1\endcsname{}%
\ifcsname currentlistoftakes\endcsname
\g@addto@macro\currentlistoftakes{,#1}% Fortsetzung
\else
\gdef\currentlistoftakes{#1}%Initialisierung
\fi
\fi}{}
\makeatother

\begin{document}
\makeatletter
\ifcsname listoftakes\endcsname
Listeninhalt ist \listoftakes\\
\begin{itemize}
\@for\takename:=\listoftakes\do{%
\item \takename: \ref{\takename}}
\end{itemize}
\fi
\makeatother

\begin{take}{Wallace}
abc
\end{take}

\begin{take}{Grommit}
abc
\end{take}

\begin{take}{Wallace}
abc
\end{take}


\makeatletter

\@for\takename:=\currentlistoftakes\do{%
\takename: \arabic{\takename}
\addtocounter{\takename}{-1}%
\refstepcounter{\takename}%
\label{\takename}}

\write\@auxout{\noexpand\gdef\noexpand\listoftakes {\currentlistoftakes}}
\makeatother


\end{document}

Meta
25-08-2010, 15:19
Du solltest dir schon die Mühe geben und bei derartigen Fragenein Rumpfdokument zum Rumprobieren mitgeben.

Hallo Ulrike,

zunächst mal: vielen Dank für deine Hilfe!
Du hast mir nun schon zum zweiten Mal geholfen. :)

Dass ich kein Minimalbeispiel oder ein Rumpfdokument bereitgestellt habe, lag nicht an meiner fehlenden Mühe, sondern einfach daran, dass es einfach nicht lief und ich ohnehin (auch) eure Vorschläge mein Problem betreffend bekommen wollte.
Hätte ich meinen nicht-funktionierenden Code bereitgestellt, wäre wahrscheinlich dein/euer erste Schritt gewesen, diesen duchzugehen und zu verbessern, sofern möglich.
Da ich mir aber nicht mal sicher wahr (und es hat sich ja als richtig herausgestellt), dass addtocontents{lof}... und listoffigures der geeignetste Weg ist, habe ich lieber mal den Mund gehalten. ;)

Ich gebe mir ansonsten schon Mühe, mit einem Minimalbeispiel dienlich zu sein.
Nur hier halt nicht.
Aber: ich gelobe Besserung! :)

Für diejenigen, die es interessiert, nachfolgend mein verwendeter Code:


\newmarks\insidetake
\newcounter{takecounter}
\setcounter{takecounter}{1}
\makeatletter
\newenvironment{take}[2][]{%
\providecounter{#2}%
\stepcounter{#2}%
\minisec{\leadzeros{\thetakecounter}\quad\MakeUppe rcase{#2}%
\ifthenelse{\equal{#1}{}}{%
}{%
~(O.S.)%
}\stepcounter{takecounter}\marks\insidetake{true}%
}%
\ifcsname takename#2\endcsname
\else
\expandafter\gdef\csname takename#2\endcsname{}%
\ifcsname currentlistoftakes\endcsname
\g@addto@macro\currentlistoftakes{,#2}
\else
\gdef\currentlistoftakes{#2}
\fi
\fi
\addmargin[10mm]{15mm}%
\addtocontents{lof}{#2: \arabic{#2}\\}%
}{%
\marks\insidetake{false}%
\endaddmargin%
}
\makeatother

\makeatletter
\newcommand{\printtakeoverview}{%
\ifcsname listoftakes\endcsname
\chapter*{Takeübersicht}%
\@for\takename:=\listoftakes\do{%
\parbox{40mm}{\MakeUppercase{\takename}}\parbox{10 mm}{\hfill\raisebox{.13em}{\ref{\takename}}}~Takes \\[0.5em]%
}%
\fi
}
\makeatother

% Hörspielskript mit Takes und allem...

\makeatletter
\@for\takename:=\currentlistoftakes\do{%
\addtocounter{\takename}{-1}%
\refstepcounter{\takename}%
\label{\takename}%
}
\write\@auxout{%
\noexpand\gdef\noexpand\listoftakes{\currentlistof takes}%
}
\makeatother


Eine Frage hätte ich wohl noch...
Eigentlich möchte ich die Takeanzahlen nämlich gerne in einer Tabelle (longtable) ausgeben.
Also habe ich den Befehl printtakeoverview zunächst so geschrieben:


\makeatletter
\newcommand{\printtakeoverview}{%
\ifcsname listoftakes\endcsname
\chapter*{Takeübersicht}%
\longtable{p{40mm}p{10mm}p{100mm}}%
\@for\takename:=\listoftakes\do{%
\MakeUppercase{\takename}&\raisebox{.13em}{\ref{\takename}&Takes\\[0.5em]%
}%
\endlongtable%
\fi
}
\makeatother


Anscheinend kann ich aber keinen Spaltenwechsel bewirken, denn wenn ich alles in die erste Spalte schreibe, gibt es keinen Fehler. Erst dann, wenn ich & verwende.
Kann ich anders die Spalten wechseln? Oder kann mir sonst jemand Abhilfe schaffen?
Liegt das am DO, also an der FOR-Schleife?

Viele liebe Grüße
Meta

u_fischer
25-08-2010, 15:34
Ich wiederhole mich:

"Du solltest dir schon die Mühe geben und bei derartigen Fragenein Rumpfdokument zum Rumprobieren mitgeben".

Ich habe keine Lust dauernd deinen Code in ein Dokument einzufügen und Beispieltakes hinzufügen usw usf. Ich habe dir ein vollständiges Dokument zu ausprobieren gegeben. Jetzt gib mal was zurück.

Meta
25-08-2010, 16:01
Ich wiederhole mich:

"Du solltest dir schon die Mühe geben und bei derartigen Fragenein Rumpfdokument zum Rumprobieren mitgeben".

Ich habe keine Lust dauernd deinen Code in ein Dokument einzufügen und Beispieltakes hinzufügen usw usf. Ich habe dir ein vollständiges Dokument zu ausprobieren gegeben. Jetzt gib mal was zurück.

...



\documentclass[parskip]{scrbook}
\usepackage{moredefs}
\usepackage{longtable}

\makeatletter
\newenvironment{take}[1]{%
\providecounter{#1}%
\stepcounter{#1}%
\minisec{\MakeUppercase{#1}}%
\ifcsname takename#1\endcsname
\else
\expandafter\gdef\csname takename#1\endcsname{}%
\ifcsname currentlistoftakes\endcsname
\g@addto@macro\currentlistoftakes{,#1}
\else
\gdef\currentlistoftakes{#1}
\fi
\fi
\addmargin[10mm]{15mm}%
}{%
\endaddmargin%
}
\makeatother

%%% GEHT
\makeatletter
\newcommand{\printtakeoverview}{%
\ifcsname listoftakes\endcsname
\chapter*{Take\"ubersicht}%
\@for\takename:=\listoftakes\do{%
\parbox{40mm}{\MakeUppercase{\takename}}\parbox{10 mm}{\hfill\ref{\takename}}~Takes\\[0.5em]%
}%
\fi
}
\makeatother

%%% GEHT AUCH
%\makeatletter
%\renewcommand{\printtakeoverview}{%
% \ifcsname listoftakes\endcsname
% \chapter*{Take\"ubersicht}%
% \longtable{p{40mm}p{10mm}p{100mm}}
% \@for\takename:=\listoftakes\do{%
% \MakeUppercase{\takename}: \ref{\takename}~Takes\\[0.5em]%
% }%
% \endlongtable
% \fi
%}
%\makeatother

%%% Geht NICHT
%\makeatletter
%\renewcommand{\printtakeoverview}{%
% \ifcsname listoftakes\endcsname
% \chapter*{Take\"ubersicht}%
% \longtable{p{40mm}p{10mm}p{100mm}}
% \@for\takename:=\listoftakes\do{%
% \MakeUppercase{\takename}&\raisebox{.13em}{\ref{\takename}}&Takes\\[0.5em]%
% }%
% \endlongtable
% \fi
%}
%\makeatother

\begin{document}
\printtakeoverview

\begin{take}{Wallace}
abc
\end{take}

\begin{take}{Grommit}
abc
\end{take}

\begin{take}{Wallace}
abc
\end{take}

\makeatletter
\@for\takename:=\currentlistoftakes\do{%
\addtocounter{\takename}{-1}%
\refstepcounter{\takename}%
\label{\takename}%
}
\write\@auxout{%
\noexpand\gdef\noexpand\listoftakes{\currentlistof takes}%
}
\makeatother

\end{document}


Bei der letzten Variante mit Tabelle und drei Spalten INKLUSIVE dem expliziten Wechsel mit & gibt es bei jedem zweiten Kompilieren Fehler und kein korrektes Ergebnis...

u_fischer
25-08-2010, 17:08
In Tabellen sind Zellen Gruppen. Definitionen in einer Zelle sind in der nächsten Weg, wenn du sie nicht global definierst. Außerdem sind Tabellen komplizierte Gebilde. Meist ist es einfacher, wenn du den Inhalt außerhalb der Tabelle zusammenbaust. Z.B. so:


\makeatletter
\newcommand{\printtakeoverview}{%
\ifcsname listoftakes\endcsname
\chapter*{Take\"ubersicht}%
\toks@={}%
\@for\takename:=\listoftakes\do{%
\edef\next{\the\toks@\noexpand\MakeUppercase{\take name}&%
\noexpand\raisebox{.13em}{\noexpand\ref{\takename} }&%
Takes\noexpand\\[0.5em]}
\toks@=\expandafter{\next}}%
\longtable{p{40mm}p{10mm}p{100mm}}
\the\toks@
\endlongtable
\fi
}
\makeatother

Meta
25-08-2010, 23:56
In Tabellen sind Zellen Gruppen. Definitionen in einer Zelle sind in der nächsten Weg, wenn du sie nicht global definierst. Außerdem sind Tabellen komplizierte Gebilde. Meist ist es einfacher, wenn du den Inhalt außerhalb der Tabelle zusammenbaust.

Works like a charm.

Vielen, vielen Dank! :)