据我所知,嵌入(作为元数据)用于生成 PDF 文档的排版引擎是一种很好的做法。下面是如何使用包完成此操作的示例hyperref
:
\hypersetup{pdfcreator={pdflatex 1.40.14}}
但是,硬编码这些信息很容易出错。如果从现在到文档的最终版本,我决定切换排版引擎,或者如果发布了新版本,而我忘记更新元数据,该怎么办?
如果可能的话,我想避免对所使用的排版引擎(名称和版本)进行硬编码...在我的tex
文件上运行该引擎时,有没有一种简单的方法可以访问该信息?
答案1
pdfTeX
TeX 编译器 pdfTeX 已经将一些键设置为默认值:
/Producer (pdfTeX-1.40.15)
/Creator (TeX)
/CreationDate (D:20140506215840+02'00')
/ModDate (D:20140506215840+02'00')
/Trapped /False
/PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) kpathsea version 6.2.0)
如果已加载,则可以通过\pdfinfo
或覆盖其中一些条目。pdfTeX 的一个不错的功能是,如果它检测到 中的标准键设置,则 pdfTeX 会抑制其设置,以避免在同一词典中出现具有不同值的重复键。因此,用户可以 或覆盖 pdfTeX 的设置。\hypersetup
hyperref
\pdfinfo
hyperref
的默认hyperref
值为(为提高可读性添加了换行符):
/Author()
/Title()
/Subject()
/Creator(LaTeX with hyperref package)
/Producer(pdfTeX-1.40.15)
/Keywords()
hyperref
其他条目也可以通过( pdfcreationdate
, pdfmoddate
, ... )设置。
pdfTeX 的版本号
由于 pdfTeX 的版本号方案在过去已经发生过改变,版本规范的算法相当复杂,如下hpdftex.def
:
\def\@pdfproducer{pdfTeX}%
\ifx\eTeXversion\@undefined
\else
\ifx\eTeXversion\relax
\else
\ifnum\eTeXversion>0 %
\def\@pdfproducer{pdfeTeX}%
\fi
\fi
\fi
\ifx\pdftexversion\@undefined
\else
\ifnum\pdftexversion<100 %
\edef\@pdfproducer{%
\@pdfproducer
\the\pdftexversion.\pdftexrevision
}%
\else
\ifnum\pdftexversion<130 %
\edef\@pdfproducer{%
\@pdfproducer-%
\expandafter\@car\the\pdftexversion\@empty\@nil.%
\expandafter\@cdr\the\pdftexversion\@empty\@nil
\pdftexrevision
}%
\else
\ifnum\pdftexversion<140 %
\else
\def\@pdfproducer{pdfTeX}%
\fi
\edef\@pdfproducer{%
\@pdfproducer-%
\expandafter\@car\the\pdftexversion\@empty\@nil.%
\expandafter\@cdr\the\pdftexversion\@empty\@nil.%
\pdftexrevision
}%
\fi
\fi
\fi
其他驱动因素
软件包hyperref
还设置了其他驱动器的信息条目。但可能会发生这种情况,即驱动器坚持某些键的设置(/Creator
,...)。
答案2
\pdftexbanner
(在 pdfTeX 1.20a 中引入;参见pdfTeX 用户手册)产生输出:
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/W32TeX) kpathsea version 6.1.1
并包含用于处理文档的 pdfTeX 版本。您可以使用以下命令仅提取 pdfTex 版本:
\makeatletter
\def\extractpdftexversion#1-#2-#3 #4\@nil{#3}
\edef\pdftexversion{\expandafter\extractpdftexversion\pdftexbanner\@nil}
\makeatother
这里\extractpdftexversion
需要一个形如 的参数文本<stuffA>-<stuffB>-<stuffC> <stuffD>\@nil
,并且只返回<stuffC>
(即左侧以 分隔-
、右侧以分隔的文本)。您可以使用以下方式将其添加到 PDF 文档属性中:
\pdfinfo{
/Producer (pdfTeX \pdftexversion)
}
\documentclass{article}
\makeatletter
\def\extractpdftexversion#1-#2-#3 #4\@nil{#3}
\edef\pdftexversion{\expandafter\extractpdftexversion\pdftexbanner\@nil}
\makeatother
\pdfinfo{
/Producer (pdfTeX \pdftexversion)
}
\begin{document}
\pdftexbanner
\end{document}
无需明确使用hyperref
(看这真的是hyperref
向 TeX 文件添加元数据的最佳方法吗?)。
答案3
适用于多种发动机的解决方案
该解决方案将独立于排版引擎工作(在 PdfLaTeX 和 LuaTeX 上测试)并使用横幅字符串。
它使用xstring
包。使用包在前言中设置元数据(或者,您也可以使用或包hyperref
提供的功能。内部使用包提供的低级元数据设置功能。)pdfx
hyperxmp
pdfx
xmpincl
\documentclass{article}
\usepackage{xstring}
% uncomment one of the two lines below suitably
% \StrBetween{\luatexbanner}{\detokenize{n }}{\detokenize{.0 (}}[\luatexversionused] % obtain luatex version used. Uncomment for luatex
% \StrBetween{\pdftexbanner}{\detokenize{n }}{\detokenize{.0 (}}[\luatexversionused] % obtain pdftex version used. Uncomment for pdftex
\usepackage{hyperref}
% uncomment one of the two lines below suitably
% \hypersetup{pdfcreator = {LuaTeX \luatexversionused} % for luatex
% \hypersetup{pdfcreator = {pdfTeX \pdftexversionused} % for pdftex
\begin{document}
blah blah....
\end{document}