使用添加 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