在下次运行时将生成的 PDF 文件的统计信息插回到文档中

在下次运行时将生成的 PDF 文件的统计信息插回到文档中

这是我想要做的一个例子:

  1. 运行后pdflatex,计算并存储(到辅助文件中?)生成的 PDF 文件的大小,如从终端命令“ du -h file.pdf”获得的,例如“50K”。 (这只是一个例子。它可以是任何其他与文件大小无关的终端命令。)

  2. 下次运行时,将存储的文本排版到文档每一页的特定位置,即页面左下角顶部和右侧给定英寸的位置。

如何才能做到这一点?

答案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进行访问。然后,您可以使用或其他类似的包将信息放在您想要的位置。\texcountwc.texfanchdr


我非常肯定这不是获取正确信息的最简单或最可靠的方法,但这是原始捆绑包中用于获取内容textcount的方法,而我正在盲目地复制它……vcgit

相关内容