Este es un ejemplo de lo que quiero hacer:
Después de ejecutar
pdflatex
, calcule y almacene (¿en un archivo auxiliar?) el tamaño del archivo PDF resultante, obtenido del comando de Terminal "du -h file.pdf
", por ejemplo, "50K". (Esto es sólo un ejemplo. Podría ser cualquier otro comando de Terminal que no esté relacionado con el tamaño de archivo).En la siguiente ejecución, escriba el texto almacenado en un lugar específico de cada página del documento, a unas pulgadas determinadas en la parte superior y derecha del punto inferior izquierdo de la página.
¿Cómo se puede hacer esto?
Respuesta1
Desde pdfTeX 1.30.0 el comando expandible \pdffilesize
está disponible. Debido a que el archivo de salida de la ejecución anterior se sobrescribirá, se debe preguntar el tamaño lo antes posible:
\edef\jobsize{\pdffilesize{\jobname.pdf}}
\documentclass{article}
\begin{document}
The file size is \jobsize~(\the\numexpr(\jobsize+512)/1024\relax~KB).
\end{document}
Sin embargo, el tamaño del archivo impreso será parte de la página. Por lo tanto, el nuevo archivo de salida probablemente tendrá un tamaño de archivo diferente. El tamaño del archivo depende de los dígitos incluidos que se utilizan en \jobname
. Si de todos modos se incluyen todos los dígitos, entonces esto no importa. Sin embargo, el flujo de la página cambia y generalmente está comprimido. Por lo tanto, es muy posible que el tamaño del archivo nunca coincida con el tamaño real del archivo, independientemente del número de repeticiones. Por tanto, redondear es una buena idea.
Más observaciones:
LuaTeX también puede ser compatible:
\RequirePackage{pdftexcmds} \makeatletter \edef\jobsize{\pdf@filesize{\jobname.pdf}} \makeatother
Si el archivo aún no existe, entonces
\pdffilesize
o\pdf@filesize
se expande a la cadena vacía, por ejemplo:\ifx\jobsize\empty \textbf{??}% \else \jobsize \fi
El tamaño también puede incluir una referencia para que LaTeX le advierta debido a referencias modificadas. Pero puede que esta no sea la mejor idea, porque es posible que el tamaño nunca se estabilice, ver arriba.
Actualizar
Algunos trucos permiten estabilizar el tamaño del archivo:
Incluya todos los dígitos (
\pdfincludechars
), incluso si algunos no se utilizan. Entonces el tamaño de fuente sigue siendo el mismo.Uso de un "formulario xobject" (un terminal PDF para material reutilizado, similar a los cuadros de guardado en (La)TeX. Luego, los flujos de página permanecen constantes. Sólo varía el flujo del xobject. El efecto aleatorio de la compresión se puede eliminar girando la compresión desactivada para este objeto.
Sigue siendo el flujo de xobject el que varía según el tamaño del archivo. Pero el tamaño del archivo está estabilizado hasta el punto de que .aux
se puede intentar agregar el tamaño del archivo en una referencia del archivo para obtener advertencias de repetición.
El siguiente ejemplo también se utiliza siunitx
para formatear el tamaño del archivo y coloca el tamaño del archivo en una ubicación fija en la página como se solicita en la pregunta. El paquete atbegshi
se utiliza para ese propósito.
\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}
Respuesta2
Puedes adoptar el enfoque delvc
manojopara hacer este tipo de cosas. La idea básica es utilizar \write18
para llamar a un script de shell que escribe las definiciones de macro relevantes en un archivo que luego se puede utilizar. A continuación se muestra un ejemplo para obtener el recuento de palabras en su documento.
Primero, su documento tex debería verse así:
\documentclass{article}
\immediate\write18{./wc foo.tex}
\input{wc}
\begin{document}
Foo and things
Words in text: \texcount
\end{document}
Y su wc
archivo debería verse así:
#!/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
Para que esto funcione, deberá agregarlo ./wc
a su shell_escape_commands
lista en su texmf.cnf
y hacer que el archivo sea ejecutable.
Ahora, cada vez que ejecute latex en el archivo, llamará ./wc
al archivo foo.tex
, que contará las palabras del archivo, extraerá la información relevante y la hará accesible con la \texcount
macro que se encuentra en el archivo ingresado wc.tex
. Luego puede usar fanchdr
algún otro paquete similar para colocar la información donde desee.
Estoy bastante seguro de que esta no es la forma más sencilla ni la más sólida de obtener la información correcta textcount
, pero este es el método que vc
usa el paquete original para obtener cosas git
y lo estaba copiando servilmente...