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