Moin,

ich würde gerne am Ende meines Dokuments die Anzahl der Zeichen ausgeben. Ich wollte wissen, ob dies automatisch möglich ist, oder ob man es händisch eingeben muss

Die folgenden Möglichkeiten zur manuellen Ermittlugn der Wörter/Zeichen, kenne ich bereits:

https://tex.stackexchange.com/a/536

gefragt 11 Jun, 08:34

latex_user's gravatar image

latex_user
211
Akzeptiert: 50%

2

Erst muss man wissen, wie die Anzahl der Zeichen bestimmt werden soll. Das ist nämlich bei LaTeX keineswegs eindeutig. So muss man sich fragen, ob die Zeichen im Quelltext oder im PDF maßgeblich sind. Beim PDF stellt sich die Frage, ob Dinge wie Trennstriche, Seitenzahlen, Kopfzeilen, Verzeichnisse mitgezählt werden sollten. Dann ist noch nicht geklärt, ob die Zeichen in Abbildungen ebenfalls zu zählen sind … Wenn man alle Fragen geklärt hat, dann erst kann man sich die Frage stellen, ob es eine Möglichkeit gibt, die Anzahl der Zeichen automatisch zu bestimmen. Wenn ja, ist der Rest machbar.

(11 Jun, 08:43) saputello

In meinem Fall soll die Zeichenzahl des Haupttextes (also des fertigen PDFs) gezählt werden (ohne Deckblatt, ohne Inhaltsverzeichnis, ohne Literaturverzeichnis, ohne Erklärung zur Selbstständigkeit, ohne Anhang, ohne Fußnoten und ohne Leerzeichen).

(11 Jun, 08:56) latex_user

Das beantworte leider bei weitem nicht alle offenen Fragen. Also anders: Wenn Du ein Programm hast, dass die gewünschte Zeichenzahl liefert, dann kannst Du dessen Ausgabe auch in eine Datei schreiben lassen und bei einem weiteren LaTeX-Lauf diese Datei per \input lesen. Die benötigten Aufrufe kann man in den build-Prozess einfügen. Entweder mit Hilfe eines Editors, der zusätzliche Aufrufe unterstützt oder mit einem zusätzlichen build-Prozessor wie arara.

(11 Jun, 11:37) saputello

BTW: Gerade weil die Anzahl der Zeichen allgemein sehr wenig spezifiziert und damit sehr wenig aussagekräftig ist, gibt es zu Abrechnungszwecken (beispielsweise für Auftragsautoren, Übersetzer etc.) das Prinzip der Normseiten. LaTeX-seitig versucht das Paket stdpage dies umzusetzen.

(11 Jun, 11:40) saputello

Es gibt ein Perl-Script namens 'wordcount'; sowas ähnliches brauchst Du. Ich weiß es nicht, aber ich glaube LaTeX alleine kann das nicht.

(11 Jun, 11:49) cis

@saputello

Die Zeichen im PDF sind maßgeblich. Trennstriche, Seitenzahlen, Kopfzeile, Verzeichnise und Zeichen in Abbildungen werden NICHT mitgezählt. Welche Fragen müssen noch beantwortet werden?

Um stdpage nutzen zu können müsssen irgendwie die Latex Macros entfernt werden, da diese sonst mit auf der Normseite landen. Mit detex? Dann werden aber natürlich auch Referenzen entfernt (Kapitel 1 etc.) Oder gibt es eine Möglichkeit den Hauptteil des Textes als .txt auszugeben? pdftotext?

Merci für die Anregungen schon mal! :)

(11 Jun, 12:48) latex_user
1

Um stdpage nutzen zu können, muss man keine LaTeX Macros entfernen. Ich würde in der Tat, damit beginnen, stdpage mit Optionen wie hyphen=false einzubinden. Dazu alle Seitenstile auf Seitenstil empty mappen (z. B. \let\ps@plain=\ps@empty, außerdem die Verzeichnisse deaktivieren (z. B. \let\tableofcontents=\relax). Wenn alles deaktiviert ist, was nicht mit gezählt werden soll, kann man in der Tat pdftotext verwenden und dann etwas wie wc. Die ganzen Einstellungen verpackt man in einer eigenen Datei, die nur für das Zähldokument verwendet wird.

(11 Jun, 13:06) saputello
Ergebnis 5 von 7 Alle anzeigen

In ConTeXt kann man dafür das Spellchecker-Modul verwenden. Jedes Wort wird zusammen mit seiner Häufigkeit der Liste in der Datei mit der Endung .words hinzugefügt. Diese Datei kann man dann wieder einlesen und leicht die Anzahl der Zeichen herausfinden. Um etwas von der Zählung auszuschließen, schaltet man den Spellchecker einfach vorübergehend aus.

Öffne in Overleaf
\setupspellchecking[state=start,method=2]
\ctxlua{languages.words.threshold=1}

\starttext

\setupspellchecking[state=stop]
\completecontent
\setupspellchecking[state=start]

\startsection[title=Knuth]
  \input knuth
  \startformula
    x_{1,2} = \frac{-b\pm\sqrt{b^2-4ac}}{2a}
  \stopformula
  \input ward
  \m{E = m c^2}
\stopsection

\startsection[title=Ward]
  \input ward
\stopsection

\startsection[title=Zapf]
  \input zapf
\stopsection

\startluacode
local wordfile = "\jobname.words"
if file.is_readable(wordfile) then
    local data = dofile(wordfile)
    local characters = 0
    for word, count in pairs(data.categories.document.languages.en.list) do
        characters = characters + #word*count
    end
    context("Total characters: " .. characters)
end
\stopluacode

\stoptext
Permanenter link

beantwortet 11 Jun, 19:36

Henri's gravatar image

Henri
13.4k42636

Nur aus Interesse: Satzzeichen und Zahlen werden dabei vermutlich nicht mit gezählt oder?

(12 Jun, 03:29) Ijon Tichy

@IjonTichy Satzzeichen und Zahlen werden, soweit ich das sehen kann, nicht mitgezählt.

(12 Jun, 06:25) Henri

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:

Öffne in Overleaf
\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:

Dieses Dokument hat ohne diese Seite 4376 Zeichen.

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.

Permanenter link

beantwortet 12 Jun, 03:24

Ijon%20Tichy's gravatar image

Ijon Tichy
7.7k11019

bearbeitet 12 Jun, 03:27

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×173
×32
×16

Frage gestellt: 11 Jun, 08:34

Frage wurde angeschaut: 537 Mal

Zuletzt aktualisiert: 12 Jun, 06:25