이것은 내가 하고 싶은 일의 예입니다:
를 실행한 후
pdflatex
터미널 명령 " "(예: "50K")에서 얻은 결과 PDF 파일의 크기를 계산하고 저장합니다(보조 파일에?)du -h file.pdf
. (이것은 단지 예일 뿐이며 파일 크기와 관련되지 않은 다른 터미널 명령일 수 있습니다.)다음 실행에서는 문서의 모든 페이지의 특정 위치(페이지 왼쪽 하단 지점의 상단과 오른쪽에 지정된 인치)에 저장된 텍스트를 조판합니다.
어떻게 할 수 있습니까?
답변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
일부 숫자가 사용되지 않더라도 모든 숫자( )를 포함합니다 . 그런 다음 글꼴 크기는 동일하게 유지됩니다."form xobject"((La)TeX의 저장 상자와 유사한 재사용된 자료에 대한 PDF 종단)를 사용합니다. 그런 다음 페이지 스트림은 일정하게 유지됩니다. 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
./wc
이제 파일에서 latex를 실행할 때마다 파일을 호출하여 foo.tex
파일의 단어 수를 계산하고 관련 정보를 추출하며 \texcount
입력된 파일에 있는 매크로 로 액세스할 수 있게 만듭니다 wc.tex
. 그런 다음 fanchdr
또는 다른 패키지를 사용하여 원하는 곳에 정보를 넣을 수 있습니다.
나는 이것이 에서 올바른 정보를 얻는 가장 간단하거나 가장 강력한 방법은 아니라고 확신합니다 . 그러나 이것은 원래 번들이 에서 물건을 가져오는 데 사용하는 textcount
방법 이고 나는 그것을 맹렬히 복사하고 있었습니다…vc
git