Basierend auf den Hinweisen auf saputellos Kommentare könnte man in der Tat das eigentliche Dokument zweimal verarbeiten: Einmal ganz normal und einmal mit zusätzlichen Einstellungen, die dafür sorgen, dass nur die Zeichen in der Ausgabe landen, die auch wirklich gezählt werden sollten. Dieses Zähldokument lässt man dann ebenfalls erstellen, macht beispielsweise mit pdftotext
eine Textdatei daraus und zählt mit einem Programm wie wc
(ist bei Linux normalerweise dabei, gibt es aber auch für OSX und Windows) dann die Zeichen in der Textdatei.
Die Erzeugung des Zähldokuments kann sehr einfach aus dem Hauptdokument per filecontents
-Umgebung erfolgen. Die Verwendung von Paket stdpage
in dem Zähldokument ist nicht zwingend, kann aber bereits einige Dinge erleichter. Fehlende Dokumentvereinfachungen ergänzt man zusätzlich.
Die benötigten Aufrufe, um aus dem Zähldokument schließlich die Anzahl der Zeichen zu erhalten, kann man in den Dokumenterstellungsvorgang ähnlich dem Aufruf von makeindex
oder biber
etc. einfügen. Man kann aber auch mit dem Paket shellesc
, das Bestandteil neuerer Version der LaTeX-Standard-Tools ist, die Aufrufe direkt aus dem Hauptdokument heraus durchführen. Dazu muss pdflatex
(oder lualatex
oder xelatex
) allerdings mit Option --shell-escape
aufgerufen werden.
Angenommen, wir haben ein Dokument test-hauptdatei.tex
:
\RequirePackage{filecontents}\begin{filecontents*}{normseiten.tex}\makeatletter\newcommand*{\GenerateInfoPage}{% \usepackage[hyphen=false,just=false,parskip]{stdpage}%\let\tableofcontents\relax\let\listoffigures\relax\let\maketitle\relax\let\ps@plain\ps@empty \let\ps@headings\ps@empty \renewcommand*{\includegraphics}[2][]{}%}\makeatother\input{test-hauptdatei.tex}\end{filecontents*}\documentclass{article}\usepackage[T1]{fontenc}\usepackage{graphicx}\newcommand*{\BeispielMakro}{Das ist nur irgend ein Beispielmakro}\usepackage{mwe}\usepackage{shellesc}\providecommand*{\GenerateInfoPage}{%\AtEndDocument{%\typeout{Es erfolgt die Ermittlung der Zeichen.}%\ShellEscape{pdflatex normseiten.tex}% Normseiten erstellen.\ShellEscape{pdftotext normseiten.pdf normseiten.txt}% In Text wandeln\ShellEscape{wc -m normseiten.txt | cut -d' ' -f1 > test-anzahlseiten.txt}% Zeichen zählen\clearpage\IfFileExists{test-anzahlseiten.txt}{% Dieses Dokument hat ohne diese Seite \input{test-anzahlseiten.txt}Zeichen. }{% Um die Anzahl der Zeichen in diesem Dokument zu bestimmen, ist Option \texttt{--shell-escape} beim Aufruf von \texttt{pdflatex} erforderlich! }%}%}\pagestyle{headings}\GenerateInfoPage% Sollte die letzte Anweisung vor \begin{document} sein!\begin{document}\title{Titel}\author{Ijon Tichy}\maketitle\tableofcontents\listoffigures\blinddocument\begin{figure}\includegraphics{example-image}\caption{Testbild mit \BeispielMakro}\end{figure}\end{document}
dann erhält man auf diese Weise als letzte Seite den Hinweis:
Wie zu sehen ist, ist das Einbinden des Zählergebnisses selbst dabei das kleinere Problem. Entscheidender ist in der Tat, dass man wirklich genau das zählt, was man wirklich zählen will. Das sollte man anhand der Datei normseiten.pdf
unbedingt überprüfen!
Um die Infoseite nicht mit zu zählen wurde ein einfacher Trick verwendet. Die Anweisung, die diese Infoseite erzeugt, wird nur dann definiert, wenn sie nicht bereits definiert ist. Im Zähldokument wiederum wird diese Anweisung bereits vorab, also vor dem Einlesen des Hauptdokument, definiert und enthält dann die ganzen Änderungen, die nur für das Zähldokument gelten. Wollte man die Infoseite mitzählen, müsste man hier stattdessen unterschiedliche Befehle verwenden und den für das Zähldokument im Hauptdokument nur ausführen, wenn er definiert ist.