pdfTeX

pdfTeX

据我所知,嵌入(作为元数据)用于生成 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 的设置。\hypersetuphyperref\pdfinfohyperref

的默认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提供的功能。内部使用包提供的低级元数据设置功能。)pdfxhyperxmppdfxxmpincl

\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}

相关内容