在下次運行時將生成的 PDF 文件的統計資料插入回文檔中

在下次運行時將生成的 PDF 文件的統計資料插入回文檔中

這是我想做的事情的一個例子:

  1. 運行後pdflatex,計算並儲存(到輔助文件中?)生成的 PDF 文件的大小,如從終端命令“ du -h file.pdf”獲得的,例如“50K”。 (這只是一個範例。它可以是與檔案大小無關的任何其他終端命令。)

  2. 下次執行時,將儲存的文字排版在文件每一頁上的特定位置,距離頁面左下點的頂部和右側給定的英吋處。

如何才能做到這一點?

答案1

從 pdfTeX 1.30.0 開始,可擴充指令\pdffilesize可用。由於上一次運行的輸出檔案將被覆蓋,因此應儘早詢問大小:

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

輸出範例

但是,列印的檔案大小將成為頁面的一部分。因此,新的輸出檔案可能具有不同的檔案大小。文件大小取決於 中使用的包含的數字\jobname。如果無論如何都包含所有數字,那麼這並不重要。然而,頁面流的變化通常是被壓縮的。因此,無論重新運行多少次,檔案大小很可能永遠不會與實際檔案大小相符。因此四捨五​​入是個好主意。

進一步說明:

  • LuaTeX 也可以支援:

    \RequirePackage{pdftexcmds}
    \makeatletter
    \edef\jobsize{\pdf@filesize{\jobname.pdf}}
    \makeatother
    
  • 如果檔案尚不存在,則\pdffilesize\pdf@filesize擴展為空字串,例如:

    \ifx\jobsize\empty
      \textbf{??}%
    \else
      \jobsize
    \fi
    
  • 大小也可以放入引用中,以便 LaTeX 因引用發生變更而發出警告。但這可能不是最好的主意,因為大小可能永遠不會穩定,請參見上文。

更新

一些技巧可以穩定檔案大小:

  • 包括所有數字 ( \pdfincludechars),即使有些數字未使用。然後字體大小保持不變。

  • 使用「表單 xobject」(重複使用材料的 PDF 終端,類似於 (La)TeX 中的保存框。然後頁面流保持不變。只有 xobject 的流發生變化。可以透過轉動來消除壓縮的隨機效應該物件的壓縮關閉。

它仍然是隨檔案大小變化的 xobject 流。但到目前為止,文件大小已經穩定,.aux可以嘗試在文件的引用中添加文件大小以獲得重新運行警告。

以下範例也用於siunitx格式化檔案大小,並將檔案大小按照問題中的要求放置在頁面中的固定位置。包atbegshi就是用於此目的。

\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}

帶有檔案大小的首頁

答案2

您可以採取以下方法vc做這種事。基本想法是呼叫\write18一個shell腳本,將相關的巨集定義寫入一個文件,然後可以使用。以下是取得文件字數統計的範例。

首先你的 tex 文件應該是這樣的:

\documentclass{article}

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

Words in text: \texcount

\end{document}

你的wc文件應該如下所示:

#!/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

為此,您需要添加./wc到您的shell_escape_commands清單中texmf.cnf並使文件可執行。

現在,每次您在文件上運行 Latex 時,它都會調用./wc該文件foo.tex,該文件將對文件進行字數統計並從中提取相關信息,並使其可通過\texcount輸入文件中的宏進行訪問wc.tex。然後,您可以使用fanchdr或其他類似的包將資訊放在您喜歡的位置。


我很確定這不是從中獲取正確資訊的最簡單或最強大的方法,但這是原始捆綁包用於獲取內容的textcount方法,而我正在盲目地複製它......vcgit

相關內容