Вот пример того, что я хочу сделать:
После запуска
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
Для этой цели используется Package.
\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
и я слепо его копировал...