Токен разрешен в строке PDF в \section, но не в настраиваемой (с помощью \addcontentsline) команде section

Токен разрешен в строке PDF в \section, но не в настраиваемой (с помощью \addcontentsline) команде section

babel's frenchboption делает активным !символ eg, автоматически предваряя его \thinspace. Такие активные символы правильно поддерживаются в разделах hyperrefзакладками 's. Но когда я пытаюсь создать свою собственную команду section со спецификацией \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 !

Предупреждение исчезнет, ​​если вы вставите a \par(а также если перед a нет текста, \addcontentslineтак как вы находитесь в vmode, то):

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

Выход:

введите описание изображения здесь

Связанный контент