Einfügen von Statistiken einer resultierenden PDF-Datei zurück in das Dokument beim nächsten Durchlauf

Einfügen von Statistiken einer resultierenden PDF-Datei zurück in das Dokument beim nächsten Durchlauf

Dies ist ein Beispiel dessen, was ich tun möchte:

  1. Berechnen und speichern Sie nach dem Ausführen von pdflatexdie Größe der resultierenden PDF-Datei (in einer Hilfsdatei?), wie sie vom Terminalbefehl " du -h file.pdf" erhalten wurde, z. B. "50K". (Dies ist nur ein Beispiel. Es könnte sich um jeden anderen Terminalbefehl handeln, der sich nicht auf die Dateigröße bezieht.)

  2. Beim nächsten Durchlauf wird der gespeicherte Text an einer bestimmten Stelle auf jeder Seite des Dokuments gesetzt, und zwar in einem bestimmten Abstand von einigen Zoll oben und rechts vom unteren linken Punkt der Seite.

Wie kann das erreicht werden?

Antwort1

Seit pdfTeX 1.30.0 \pdffilesizeist der expandable-Befehl verfügbar. Da die Ausgabedatei des vorherigen Durchlaufs überschrieben wird, sollte die Größe so früh wie möglich abgefragt werden:

\edef\jobsize{\pdffilesize{\jobname.pdf}}
\documentclass{article}
\begin{document}
  The file size is \jobsize~(\the\numexpr(\jobsize+512)/1024\relax~KB).
\end{document}

Beispielausgabe

Die gedruckte Dateigröße ist jedoch Teil der Seite. Daher wird die neue Ausgabedatei wahrscheinlich eine andere Dateigröße haben. Die Dateigröße hängt von den enthaltenen Ziffern ab, die in verwendet werden \jobname. Wenn alle Ziffern sowieso enthalten sind, spielt dies keine Rolle. Der Seitenstrom ändert sich jedoch, da er normalerweise komprimiert wird. Daher ist es durchaus möglich, dass die Dateigröße unabhängig von der Anzahl der Wiederholungen nie der tatsächlichen Dateigröße entspricht. Daher ist Runden eine gute Idee.

Weitere Bemerkungen:

  • LuaTeX kann auch unterstützt werden:

    \RequirePackage{pdftexcmds}
    \makeatletter
    \edef\jobsize{\pdf@filesize{\jobname.pdf}}
    \makeatother
    
  • Wenn die Datei noch nicht existiert, wird \pdffilesizeoder \pdf@filesizezu einer leeren Zeichenfolge erweitert, Beispiel:

    \ifx\jobsize\empty
      \textbf{??}%
    \else
      \jobsize
    \fi
    
  • Die Größe kann auch in eine Referenz eingegeben werden, um von LaTeX wegen geänderter Referenzen gewarnt zu werden. Dies ist jedoch möglicherweise nicht die beste Idee, da sich die Größe möglicherweise nie stabilisiert, siehe oben.

Aktualisieren

Einige Tricks ermöglichen die Stabilisierung der Dateigröße:

  • Schließen Sie alle Ziffern ( \pdfincludechars) ein, auch wenn einige nicht verwendet werden. Dann bleibt die Schriftgröße gleich.

  • Verwendung eines „Form-XObjects“ (eine PDF-Terminologie für wiederverwendetes Material, ähnlich den Speicherfeldern in (La)TeX). Dann bleiben die Seitenströme konstant. Nur der Strom des XObjects variiert. Der zufällige Effekt der Komprimierung kann eliminiert werden, indem die Komprimierung für dieses Objekt ausgeschaltet wird.

Es bleibt der Xobject-Stream, der mit der Dateigröße variiert. Die Dateigröße ist jedoch soweit stabilisiert, dass .auxversucht werden kann, die Dateigröße in einer Referenz in der Datei hinzuzufügen, um Wiederholungswarnungen zu erhalten.

Das folgende Beispiel verwendet ebenfalls siunitxdie Formatierung der Dateigröße und platziert die Dateigröße an einer festen Stelle auf der Seite, wie in der Frage gefordert. atbegshiZu diesem Zweck wird das Paket verwendet.

\RequirePackage{pdftexcmds}% support LuaTeX
\makeatletter
\edef\jobsize{\pdf@filesize{\jobname.pdf}}
\makeatother

\documentclass{article}

\usepackage{siunitx}
\DeclareBinaryPrefix{\kibi}{Ki}{10}
\DeclareBinaryPrefix{\mebi}{Mi}{20}
\DeclareBinaryPrefix{\gibi}{Gi}{30}
\DeclareSIUnit\byte{B}

\makeatletter
\newcommand*{\printjobsize}{%
  \@ifundefined{xform@jobsize}{%
    \begingroup
      \sbox0{%
        \sisetup{detect-mode=false,mode=text}%
        \pdfincludechars\font{0123456789 ()}%
        \pdfincludechars\font{\si{\kibi\byte}\si{\mebi\byte}\si{\gibi\byte}}%
        \ifx\jobsize\@empty
          \textbf{??}%
        \else
          \expandafter\num\expandafter{\jobsize}~bytes (%
          \ifnum\numexpr(\jobsize+512)/1024\relax<10 %
          \else
            \ifnum\numexpr(\jobsize+524288)/1048576\relax<10 %
              \expandafter\SI\expandafter{\the\numexpr(\jobsize+512)/1024\relax
            \else
              \ifnum\numexpr(\jobsize+536870912)/1073741824\relax<10 %
                \expandafter\SI\expandafter{\the\numexpr(\jobsize+524288)/10485
              \else
                \expandafter\SI\expandafter{\the\numexpr(\jobsize+536870912)/10
              \fi
            \fi
            )%
          \fi
        \fi
      }%
      \pdfcompresslevel=0\relax
      \immediate\pdfxform0\relax
      \xdef\xform@jobsize{\the\pdflastxform}%
    \endgroup
  }{}%
  \pdfrefxform\xform@jobsize\relax
}
% Adding the file size as reference of the new reference class "jobsize"
% in the ".aux" file.
\newcommand*{\newjobsize}{\@newl@bel{jobsize}{jobsize}}
\AtBeginDocument{%
  \if@filesw
    \immediate\write\@mainaux{\string\providecommand\string\newjobsize[1]{}}%
    \immediate\write\@mainaux{\string\newjobsize{\jobsize}}%
  \fi
}
\makeatother

% Put the file size 10mm from the left margin and 10mm from the bottom
\usepackage{atbegshi}
\usepackage{picture}
\AtBeginShipout{%
  \AtBeginShipoutUpperLeft{%
    \put(10mm,\dimexpr-\paperheight+10mm\relax){% 
      \makebox(0,0)[lb]{File size: \printjobsize}%
    }%
  }%  
}

\usepackage{lipsum}

\begin{document}  
  \tableofcontents
  \section{Hello World}
  \lipsum[1-10]
\end{document}

Erste Seite mit Dateigröße

Antwort2

Sie können den Ansatz desvcbündelnum so etwas zu tun. Die Grundidee besteht darin, \write18ein Shell-Skript aufzurufen, das die relevanten Makrodefinitionen in eine Datei schreibt, die dann verwendet werden kann. Hier ist ein Beispiel zum Abrufen der Wortanzahl in Ihrem Dokument.

Zunächst sollte Ihr Tex-Dokument so aussehen:

\documentclass{article}

\immediate\write18{./wc foo.tex}
\input{wc}
\begin{document}
Foo and things

Words in text: \texcount

\end{document}

Und Ihre wcDatei sollte folgendermaßen aussehen:

#!/bin/sh
# This is the 'wc' file inspired by 'vc' available on CTAN

texcount $1 | awk '/Words in text/ {print "\\gdef\\texcount{" $4 "}"}' > wc.tex

Damit dies funktioniert, müssen Sie ./wcIhre shell_escape_commandsListe ergänzen texmf.cnfund die Datei ausführbar machen.

./wcJetzt wird jedes Mal, wenn Sie Latex auf der Datei ausführen, die Datei aufgerufen, foo.texwodurch die Wörter in der Datei gezählt und die relevanten Informationen daraus extrahiert werden. Diese werden dann mit dem \texcountMakro in der Eingabedatei zugänglich gemacht wc.tex. Sie können dann oder ein anderes solches Paket verwenden, fanchdrum die Informationen dort abzulegen, wo Sie möchten.


Ich bin ziemlich sicher, dass dies nicht der einfachste oder zuverlässigste Weg ist, um die richtigen Informationen herauszubekommen textcount, aber dies ist die Methode, die das Originalpaket vcverwendet, um Dinge herauszubekommen, gitund ich habe das sklavisch kopiert …

verwandte Informationen