PDF 字符串中允许使用 \section 中的标记,但自定义(使用 \addcontentsline)部分命令中不允许使用

PDF 字符串中允许使用 \section 中的标记,但自定义(使用 \addcontentsline)部分命令中不允许使用

babel选项frenchb使 eg!字符自动以 开头,从而使\thinspaceeg 字符变为活动字符。 书签在部分中正确支持此类活动字符hyperref。 但是,当我尝试使用规范创建自己的部分命令时\addcontentsline,这会导致众所周知的Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding)警告,如以下 MWE 所指出的那样:

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{hyperref}

\newcommand{\mynaivesection}[1]{%
  \textbf{#1}%
  \addcontentsline{toc}{section}{#1}%
}

\begin{document}
\tableofcontents
\section{Foo !}
\mynaivesection{Bar !}
\end{document}

为了消除这个警告,我(故意天真的)自定义部分命令中缺少什么?

顺便提一句:

  1. \textbf{#1}%如果我删除这个自定义部分命令,则不会出现任何警告:相当奇怪......
  2. bookmark包在这里没有帮助。

答案1

不是 hyperref 清理了参数。\section和 之间的主要区别在于, 是\addcontentsline在垂直模式下首次发出的。 ! 的定义取决于模式:

\french@sh@!@ ->\ifhmode \ifdim \lastskip >\z@ \unskip \penalty \@M \FBthinspace
\else \FDP@thinspace \fi \fi \string !

如果您插入一个,警告就会消失\par(并且如果在 vmode 下,在之前没有文本\addcontentsline):

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage[]{hyperref}
\usepackage{etoolbox}
\pretocmd\addcontentsline{\ifvmode \message{V-Mode!#3}\else\message{H-Mode!#3}\fi}{}{}

\newcommand{\mynaivesection}[1]{%
  #1\addcontentsline{toc}{section}{{#1}}}%

\begin{document}

\tableofcontents

\section{Foo !}

\mynaivesection{Bar!}


\renewcommand{\mynaivesection}[1]{%
  #1\par\addcontentsline{toc}{section}{{#1}}}%

\mynaivesection{FooBar!}  

\end{document}

答案2

您可以本地重新定义\FBthinspace以不执行任何操作。

\newcommand{\mynaivesection}[1]{%
  \textbf{#1}%
  \begingroup%
  \renewcommand{\FBthinspace}{}%
  \addcontentsline{toc}{section}{#1}%
  \endgroup%
}

梅威瑟:

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{hyperref}

\newcommand{\mynaivesection}[1]{%
  \textbf{#1}%
  \begingroup%
  \renewcommand{\FBthinspace}{}%
  \addcontentsline{toc}{section}{#1}%
  \endgroup%
}

\begin{document}
\tableofcontents
\section{Foo !}
\mynaivesection{Bar !}
\end{document} 

输出:

在此处输入图片描述

相关内容