Inserindo estatísticas de um arquivo PDF resultante de volta ao documento na próxima execução

Inserindo estatísticas de um arquivo PDF resultante de volta ao documento na próxima execução

Este é um exemplo do que quero fazer:

  1. Após a execução de pdflatex, calcule e armazene (em um arquivo auxiliar?) o tamanho do arquivo PDF resultante, obtido no comando do Terminal " du -h file.pdf", por exemplo, "50K". (Este é apenas um exemplo. Pode ser qualquer outro comando do Terminal não relacionado ao tamanho do arquivo.)

  2. Na próxima execução, digite o texto armazenado em um local específico em cada página do documento, a alguns centímetros da parte superior e direita do ponto inferior esquerdo da página.

Como isso pode ser feito?

Responder1

Desde o pdfTeX 1.30.0 o comando expansível \pdffilesizeestá disponível. Como o arquivo de saída da execução anterior será sobrescrito, o tamanho deve ser solicitado o mais cedo possível:

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

Exemplo de saída

No entanto, o tamanho do arquivo impresso fará parte da página. Assim, o novo arquivo de saída provavelmente terá um tamanho de arquivo diferente. O tamanho do arquivo depende dos dígitos incluídos usados ​​em arquivos \jobname. Se todos os dígitos forem incluídos de qualquer maneira, isso não importa. No entanto, o fluxo da página muda e geralmente é compactado. Portanto, é bem possível que o tamanho do arquivo nunca corresponda ao tamanho real do arquivo, independentemente do número de repetições. Portanto, arredondar é uma boa ideia.

Observações adicionais:

  • LuaTeX também pode ser suportado:

    \RequirePackage{pdftexcmds}
    \makeatletter
    \edef\jobsize{\pdf@filesize{\jobname.pdf}}
    \makeatother
    
  • Se o arquivo ainda não existir, então \pdffilesizeou \pdf@filesizese expande para uma string vazia, exemplo:

    \ifx\jobsize\empty
      \textbf{??}%
    \else
      \jobsize
    \fi
    
  • O tamanho também pode ser colocado em uma referência para ser avisado pelo LaTeX por causa de referências alteradas. Mas esta pode não ser a melhor ideia, porque o tamanho pode nunca estabilizar, veja acima.

Atualizar

Alguns truques permitem estabilizar o tamanho do arquivo:

  • Inclui todos os dígitos ( \pdfincludechars), mesmo que alguns não sejam usados. Então o tamanho da fonte permanece o mesmo.

  • Uso de um "form xobject" (um terminal PDF para material reutilizado, semelhante às caixas de salvamento em (La)TeX. Então, os fluxos de páginas permanecem constantes. Apenas o fluxo do xobjeto varia. O efeito aleatório da compactação pode ser eliminado girando a compactação para este objeto.

Permanece o fluxo xobject que varia com o tamanho do arquivo. Mas o tamanho do arquivo está estabilizado até agora que pode-se tentar adicionar o tamanho do arquivo em uma referência no .auxarquivo para obter avisos de nova execução.

O exemplo a seguir também usa siunitxpara formatar o tamanho do arquivo e coloca o tamanho do arquivo em um local fixo na página conforme solicitado na pergunta. O pacote atbegshié usado para esse 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}

Primeira página com tamanho do arquivo

Responder2

Você pode adotar a abordagem dovcpacotepara fazer esse tipo de coisa. A ideia básica é usar \write18para chamar um script de shell que grava as definições de macro relevantes em um arquivo que pode então ser usado. Aqui está um exemplo para obter a contagem de palavras em seu documento.

Primeiro, seu documento tex deve ficar assim:

\documentclass{article}

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

Words in text: \texcount

\end{document}

E seu wcarquivo deve ficar assim:

#!/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 isso funcione, você precisará adicionar ./wcà sua shell_escape_commandslista texmf.cnfe tornar o arquivo executável.

Agora, toda vez que você executar o latex no arquivo, ele chamará ./wco arquivo foo.texque fará a contagem de palavras do arquivo e extrairá dele as informações relevantes e o tornará acessível com a \texcountmacro que está no wc.texarquivo inserido. Você pode então usar fanchdralgum outro pacote para colocar as informações onde quiser.


Tenho certeza de que esta não é a maneira mais simples ou robusta de obter as informações corretas textcount, mas esse é o método que o vcpacote original usa para extrair coisas gite eu estava copiando isso servilmente…

informação relacionada