Este é um exemplo do que quero fazer:
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.)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 \pdffilesize
está 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}
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
\pdffilesize
ou\pdf@filesize
se 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 .aux
arquivo para obter avisos de nova execução.
O exemplo a seguir também usa siunitx
para 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}
Responder2
Você pode adotar a abordagem dovc
pacotepara fazer esse tipo de coisa. A ideia básica é usar \write18
para 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 wc
arquivo 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_commands
lista texmf.cnf
e tornar o arquivo executável.
Agora, toda vez que você executar o latex no arquivo, ele chamará ./wc
o arquivo foo.tex
que fará a contagem de palavras do arquivo e extrairá dele as informações relevantes e o tornará acessível com a \texcount
macro que está no wc.tex
arquivo inserido. Você pode então usar fanchdr
algum 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 vc
pacote original usa para extrair coisas git
e eu estava copiando isso servilmente…