Token permitido en la cadena PDF en \section pero no en un comando de sección personalizado (con \addcontentsline)

Token permitido en la cadena PDF en \section pero no en un comando de sección personalizado (con \addcontentsline)

babelLa frenchbopción activa, por ejemplo, !el carácter haciéndolo precedido automáticamente por un \thinspace. Estos caracteres activos están debidamente admitidos en las secciones de hyperreflos marcadores. Pero, cuando intento crear mi propio comando de sección con una \addcontentslineespecificación, esto me lleva a la conocida Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding)advertencia, como lo señala el siguiente 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}

¿Qué falta en mi comando de sección personalizado (deliberadamente ingenuo) para deshacerme de esta advertencia?

POR CIERTO:

  1. no hay ninguna advertencia si elimino \textbf{#1}%el comando de esta sección personalizada: bastante extraño...
  2. bookmarkEl paquete no ayuda aquí.

Respuesta1

No es la hiperreferencia lo que desinfecta el argumento. La principal diferencia entre \sectiony su comando es que \addcontentslineel primero se emite en modo vertical. Y la definición de ! depende del modo:

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

La advertencia desaparece si inserta un \par(y también si no hay ningún texto antes, \addcontentslineya que estás en 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}

Respuesta2

Puede redefinir localmente \FBthinspacepara no hacer nada.

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

MWE:

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

Producción:

ingrese la descripción de la imagen aquí

información relacionada