通过 \addcontentsline 将命令的输出添加到书签

通过 \addcontentsline 将命令的输出添加到书签

我想通过 将命令的结果/值/输出添加到 ToC \addcontentsline{toc}。输出本身只包含纯文本,因此原则上应该允许它甚至在书签超链接中显示。

下面是一个例子。

\documentclass{article}
\usepackage{hyperref}
\usepackage{projlib-datetime}
\begin{document}
% \tableofcontents\bigskip
\addcontentsline{toc}{section}{\TheDate{2023-01}}
\end{document}

理想情况下,输出January 2023应该显示在书签中,但现在我收到了警告:

Token not allowed in a PDF string (Unicode):
(hyperref)  removing `\TheDate'.

我认为可能存在一些扩展问题,但有没有什么方法可以解决这个问题,以便最终的输出能够成功放入书签中?

答案1

projlib-datetime定义\TheDate为受保护的宏。因此,在生成书签文本时,宏仍然存在。hyperref在这种情况下会发出警告并删除该命令。

您需要的是可扩展的\TheDate。您可以一般使用此类命令,也可以仅在书签生成中使用\pdfstringdefDisableCommands

\documentclass{article}
\usepackage{hyperref}
\usepackage{projlib-datetime}
\newcommand*{\monthname}[1]{%
  \ifcase #1 \or 
    January\or February\or March\or April\or May\or June\or
    July\or August\or September\or October\or November\or
    December
  \fi
}
\makeatletter
\newcommand*\theYearMonth[1]{\@theYearMonth#1\\}
\newcommand*{\@theYearMonth}{}
\def\@theYearMonth#1-#2\\{\monthname{#2} #1}
\makeatother
\pdfstringdefDisableCommands{%
  \let\TheDate\theYearMonth
}
\begin{document}
\tableofcontents
\addcontentsline{toc}{section}{\TheDate{2023-01}}
Test
\addcontentsline{toc}{section}{\theYearMonth{2023-02}}
Toast
\end{document}

相关内容