假设我有一个 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}