這是我想做的事情的一個例子:
運行後
pdflatex
,計算並儲存(到輔助文件中?)生成的 PDF 文件的大小,如從終端命令“du -h file.pdf
”獲得的,例如“50K”。 (這只是一個範例。它可以是與檔案大小無關的任何其他終端命令。)下次執行時,將儲存的文字排版在文件每一頁上的特定位置,距離頁面左下點的頂部和右側給定的英吋處。
如何才能做到這一點?
答案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
方法,而我正在盲目地複製它......vc
git