Seite 1 von 1

Markierungen zählen

Verfasst: Di 19. Mai 2015, 04:23
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]

Verfasst: Di 19. Mai 2015, 11:10
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.

Verfasst: Di 19. Mai 2015, 14:45
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).