如何在最终的 PDF 文件中包含源文件的哈希值?

如何在最终的 PDF 文件中包含源文件的哈希值?

假设我有一个 poem.tex 源文件。

有没有办法将源文件的哈希值作为文本包含在最终的 PDF 中?我通常用它pdflatex来生成 PDF 文件。

我正在寻找类似的结果shasum poem.tex,看起来像这样:

c0c0fa9a776ea1891264c884e0e69dbde6142c4a,

被添加到命令输出文件主体的某处pdflatex poem.tex

有没有简单的方法可以做到这一点?

答案1

pdfTeX 包含用于此目的的原语\pdfmdfivesum,在最近的 XeTeX 中可用,\mdfivesum并在 Lua 中为 LuaTeX 包实现pdftexcmds。使用后者作为包装器,我们可能会有

\documentclass{article}

\usepackage{blindtext}
\usepackage{fancyhdr}
\usepackage{pdftexcmds}
\makeatletter
\ifx\pdf@filemdfivesum\undefined\def\pdf@filemdfivesum#{\mdfivesum file}\fi
\let\filesum\pdf@filemdfivesum
\makeatother
\pagestyle{fancy}
\fancyhf{}

\cfoot{\filesum{\jobname}}

\begin{document}
\blindtext[5]
\end{document}

原始语法(如果我们假设 pdfTeX/XeTeX):

\documentclass{article}

\usepackage{blindtext}
\usepackage{fancyhdr}
\makeatletter
\ifx\pdfmdfivesum\undefined
  \let\pdfmdfivesum\mdfivesum
\fi
\edef\filesum{\pdfmdfivesum file {\jobname}}
\makeatother
\pagestyle{fancy}
\fancyhf{}

\cfoot{\filesum}

\begin{document}
\blindtext[5]
\end{document}

答案2

这会将校验和存储在变量中\shasum。所有 都\string\\\string\\需要进入\\\\shell 流。--shell-escape当然需要选项。此解决方案的优点是结果存储在宏中,在我看来这更自然。

\documentclass{article}

\makeatletter
\begingroup
\catcode`\%=11
\immediate\write18{printf "\string\\\string\\edef\string\\\string\\shasum{%s}" `shasum \jobname.tex | awk '{print $1}'` > \jobname.sha}
\endgroup
\input{\jobname.sha}
\makeatother

\begin{document}

The checksum is \shasum.

\end{document}

答案3

另一种 Linux/Unix - 基于 shell 转义的方法(尽管有\pdfmdfivesum file {yourfilename}

它将哈希写入文件并将其读回原始文件。

\documentclass{article}

\usepackage{blindtext}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}

\AtBeginDocument{%
  \immediate\write18{shasum \jobname.tex | awk '{print $1}'>  \jobname.hash}
}

\cfoot{\input{\jobname.hash}}

\begin{document}
\blindtext[5]
\end{document}

在此处输入图片描述

读取宏的一种变体:

\documentclass{article}

\usepackage{blindtext}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}

\newread\hashfile

\AtBeginDocument{%
  \immediate\write18{shasum \jobname.tex | awk '{print $1}'>  \jobname.hash}
  \openin\hashfile=\jobname.hash
  \read\hashfile to \filehash
  \closein\hashfile
}

\cfoot{\filehash}

\begin{document}

\blindtext[5]
\end{document}

相关内容