Insertar estadísticas de un archivo PDF resultante nuevamente en el documento en la siguiente ejecución

Insertar estadísticas de un archivo PDF resultante nuevamente en el documento en la siguiente ejecución

Este es un ejemplo de lo que quiero hacer:

  1. 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).

  2. 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 \pdffilesizeestá 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}

Salida de ejemplo

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 \pdffilesizeo \pdf@filesizese 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 .auxse 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 siunitxpara 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 atbegshise 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}

Primera página con tamaño de archivo.

Respuesta2

Puedes adoptar el enfoque delvcmanojopara hacer este tipo de cosas. La idea básica es utilizar \write18para 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 wcarchivo 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 ./wca su shell_escape_commandslista en su texmf.cnfy hacer que el archivo sea ejecutable.

Ahora, cada vez que ejecute latex en el archivo, llamará ./wcal archivo foo.tex, que contará las palabras del archivo, extraerá la información relevante y la hará accesible con la \texcountmacro que se encuentra en el archivo ingresado wc.tex. Luego puede usar fanchdralgú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 vcusa el paquete original para obtener cosas gity lo estaba copiando servilmente...

información relacionada