Dies ist ein Beispiel dessen, was ich tun möchte:
Berechnen und speichern Sie nach dem Ausführen von
pdflatex
die 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.)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 \pdffilesize
ist 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}
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
\pdffilesize
oder\pdf@filesize
zu 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 .aux
versucht werden kann, die Dateigröße in einer Referenz in der Datei hinzuzufügen, um Wiederholungswarnungen zu erhalten.
Das folgende Beispiel verwendet ebenfalls siunitx
die Formatierung der Dateigröße und platziert die Dateigröße an einer festen Stelle auf der Seite, wie in der Frage gefordert. atbegshi
Zu 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}
Antwort2
Sie können den Ansatz desvc
bündelnum so etwas zu tun. Die Grundidee besteht darin, \write18
ein 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 wc
Datei 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 ./wc
Ihre shell_escape_commands
Liste ergänzen texmf.cnf
und die Datei ausführbar machen.
./wc
Jetzt wird jedes Mal, wenn Sie Latex auf der Datei ausführen, die Datei aufgerufen, foo.tex
wodurch die Wörter in der Datei gezählt und die relevanten Informationen daraus extrahiert werden. Diese werden dann mit dem \texcount
Makro in der Eingabedatei zugänglich gemacht wc.tex
. Sie können dann oder ein anderes solches Paket verwenden, fanchdr
um 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 vc
verwendet, um Dinge herauszubekommen, git
und ich habe das sklavisch kopiert …