hyperref PDF 元数据中的 Strip 环境命令

hyperref PDF 元数据中的 Strip 环境命令

使用添加 PDF 元数据时,hyperref您还可以使用某些 LaTeX 命令,这些命令在转换为 PDF 字符串时会被神奇地删除。但这似乎不适用于环境。

\documentclass{article}
\newcommand\foo[1]{foo #1}
\newenvironment{fooenv}{foobegin}{fooend}
\usepackage{hyperref}
\hypersetup{pdfauthor=\foo{Author}} % works
\hypersetup{pdftitle={\begin{fooenv}Title\end{fooenv}.}} % error
\begin{document}
\end{document}

有没有什么方法可以让环境在这种设置下表现得像常规命令一样?

答案1

以下解决方法允许通过修补按预期使用环境\pdfstringdef

\documentclass{article}
\newcommand\foo[1]{foo #1}
\newenvironment{fooenv}{foobegin}{fooend}
\usepackage{hyperref}

\usepackage{etoolbox}
\catcode`\#=12
\newcommand{\patchpdfstringdef}{%
    \patchcmd\pdfstringdef%
        {\def \begin #1{\csname #1\endcsname }}%
        {\def \begin ##1{\csname ##1\endcsname }}%
        {}{}%
    \patchcmd\pdfstringdef%
        {\def \end #1{\csname end#1\endcsname }}%
        {\def \end ##1{\csname end##1\endcsname }}%
        {}{}%

}
\catcode`\#=6
\patchpdfstringdef

\hypersetup{pdfauthor=\foo{Author}} % works
\hypersetup{pdftitle={\begin{fooenv}Title\end{fooenv}.}} % error
\begin{document}
    Hello!
\end{document}

它利用了修补宏内的参数

这会导致以下元数据存储在 PDF 中(通过 查询pdfinfo):

Title:          foobeginTitlefooend.
Author:         foo Author

相关内容