.png)
babel
La frenchb
opció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 hyperref
los marcadores. Pero, cuando intento crear mi propio comando de sección con una \addcontentsline
especificació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:
- no hay ninguna advertencia si elimino
\textbf{#1}%
el comando de esta sección personalizada: bastante extraño... bookmark
El paquete no ayuda aquí.
Respuesta1
No es la hiperreferencia lo que desinfecta el argumento. La principal diferencia entre \section
y su comando es que \addcontentsline
el 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, \addcontentsline
ya 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 \FBthinspace
para 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: