这是我想要做的一个例子:
运行后
pdflatex
,计算并存储(到辅助文件中?)生成的 PDF 文件的大小,如从终端命令“du -h file.pdf
”获得的,例如“50K”。 (这只是一个例子。它可以是任何其他与文件大小无关的终端命令。)下次运行时,将存储的文本排版到文档每一页的特定位置,即页面左下角顶部和右侧给定英寸的位置。
如何才能做到这一点?
答案1
自 pdfTeX 1.30.0 开始,expandable 命令\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