Вставка статистики полученного 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Для этой цели используется 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и я слепо его копировал...

Связанный контент