次回の実行時に、結果のPDFファイルの統計情報をドキュメントに挿入する

次回の実行時に、結果のPDFファイルの統計情報をドキュメントに挿入する

これは私がやりたいことの例です:

  1. を実行した後pdflatex、ターミナル コマンド " du -h file.pdf" から取得した結果の 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関連するマクロ定義をファイルに書き込んで使用できるようにするためのシェル スクリプトを呼び出すことです。以下は、ドキュメント内の単語数を取得する例です。

まず、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_commandstexmf.cnf

これで、ファイルに対して LaTeX を実行するたびに、./wcファイルがfoo.tex呼び出され、ファイルの単語数がカウントされ、そこから関連情報が抽出され、\texcount入力ファイル内のマクロでアクセスできるようになります。その後、 または他の同様のパッケージを使用して、情報を好きな場所に配置wc.texできます。fanchdr


これは から正しい情報を取得するための最も簡単で堅牢な方法ではないことは確かですが、これはから情報を取得するためにtextcount元のバンドルが使用する方法であり、私はそれを忠実にコピーしていました...vcgit

関連情報