Markierungen zählen Thema ist als GELÖST markiert

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Benji

Markierungen zählen

Beitrag von Benji »

Hallo

Ich setzte in einem Dokument Markierungen und zähle diese (es geht nicht darum, Text zu parsen oder Wörter zu zählen). Hier ein Minimalbeispiel:
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}

\makeatletter
\newcommand\markierung[1]{% Kommando um Markierung zu setzten
    \@ifundefined{c@mark_#1}{%  Schauen, ob der jeweilge Counter schon existiert
        \newcounter{mark_#1}% Wenn nicht, einen Counter anlegen
    }{}%
    \stepcounter{mark_#1}% Hochzaehlen
}

\newcommand\zaehle[1]{%
    \@ifundefined{c@mark_#1}{% Wenn der Counter existiert
    }{%
    \arabic{mark_#1}% Wert ausgeben
    }%
}
\makeatother


\begin{document}

Blau\markierung{blau}, Gruen\markierung{gruen}, Hellblau\markierung{blau}, Gruen\markierung{gruen},

Im Text kam \zaehle{blau} mal Blau vor und \zaehle{gruen} mal Gruen vor. 
% Ausgabe: Im Text kam 2 mal Blau vor und 2 mal Gruen vor.
% Bereits hier sollte das Endergebnis stehen, das heißt 3 mal Blau

Blau\markierung{blau}

Im Text kam \zaehle{blau} mal Blau vor und \zaehle{gruen} mal Gruen vor.
% Ausgabe: Im Text kam 3 mal Blau vor und 2 mal Gruen vor.
\end{document}
--> Grundsätzlich funktioniert es, jedoch, gibt er nur die Anzahl an Markierungen bis zu der Stelle aus, wo ich \zaehle anwende.

Die einzige Lösung, die mir jetzt einfällt, die Zahl am Ende in ein File zu schreiben, dann nochmal bauen lassen und die Zahl auslesen. Aber es müsste doch eine "elegantere" Möglichkeit geben?

Vielen lieben Dank... Ich zerbreche mir da schon ewig den Kopf, weiß aber auch nicht, wie man nach so was googlen soll. :-(

Benji[/code]

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Die einzige Lösung, die mir jetzt einfällt, die Zahl am Ende in ein File zu schreiben, dann nochmal bauen lassen und die Zahl auslesen. Aber es müsste doch eine "elegantere" Möglichkeit geben?
Inwiefern eleganter? Wenn du am Anfang den Wert vom Ende wissen willst, dann geht es nicht anders. Du musst zweimal kompilieren.

Im caption-Paket gibt es ein totalcount.sty, den du nutzen kannst.

Benji

Beitrag von Benji »

Vielen Dank. Das mit dem totalcount habe ich jetzt nicht hinbekommen.

Mit "eleganter" meinte ich so was wie "gehe erst alle \markierungen durch und dann setzte \zaehle". Also, dass man nicht den Umweg über das File machen muss.

Ich paste dann zur Vollständigkeit mal meinen Code für das Schreiben in die Datei, falls jemand mal was Ähnliches sucht.
\newcommand\openCountFile{%
    \newwrite\countout%
    \immediate\openout\countout=counts.dat%
}

\def\chopline#1;#2 \\{%
    \@ifundefined{c@load:#1}{%
        \newcounter{load:#1}%
    }{}%
    \setcounter{load:#1}{#2}%
}

\newcommand\closeCountFile{\immediate\closeout\countout}

\newif\ifmore 
\moretrue
\newcommand\loadCounterValues{%
    \IfFileExists{counts.dat}{%
        \newread\quelle%
        \openin\quelle=counts.dat%
        \loop%
        \read\quelle to \zeile%
        \ifeof\quelle%
        \global\morefalse%
        \else%
        \expandafter\chopline\zeile\\%
        \fi%
        \ifmore\repeat%
        \closein\quelle%
    }%
}

\newcommand\markierung[1]{%
    \@ifundefined{c@mark:#1}{%
        \newcounter{mark:#1}%
    }{}%
    \stepcounter{mark:#1}%
    \immediate\write\countout{mark:#1;\arabic{mark:#1}}%
}

\newcommand\zaehle[1]{%
    \@ifundefined{c@load:mark:#1}{%
        \@latex@warning{%
            \G@refundefinedtrue%
            Markierung '#1' on page \thepage \space undefined}%
        (??)%
    }{%
        (\arabic{load:mark:#1})%
    }%
}

\AtBeginDocument{
    \loadCounterValues
    
    \openCountFile
}

\AtEndDocument{
    \closeCountFile
}
Sicher nicht die eleganteste und hübscheste Umsetztung, aber sie funktioniert sehr zuverlässig (bis jetzt).

Antworten