Token permitido na string PDF em \section mas não em um comando de seção personalizado (com \addcontentsline)

Token permitido na string PDF em \section mas não em um comando de seção personalizado (com \addcontentsline)

babelA opção de frenchbtorna ativo, por exemplo, !o caractere, tornando-o automaticamente precedido por um \thinspace. Esses caracteres ativos são devidamente suportados nas seções dos hyperrefmarcadores de. Mas, quando tento criar meu próprio comando de seção com uma \addcontentslineespecificação, isso leva ao Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding)aviso bem conhecido, conforme apontado pelo seguinte 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}

O que está faltando no meu comando de seção personalizada (deliberadamente ingênuo) para me livrar desse aviso?

POR FALAR NISSO:

  1. não há nenhum aviso se eu remover \textbf{#1}%este comando de seção personalizada: bastante estranho...
  2. bookmarkpacote não ajuda aqui.

Responder1

Não é o hiperref que limpa o argumento. A principal diferença entre \sectione seu comando é que o \addcontentslineé emitido para o primeiro no modo vertical. E a definição do ! depende do modo:

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

O aviso desaparece se você inserir um \par(e também se não houver texto antes de \addcontentslinevocê estar no vmode então):

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

Responder2

Você pode redefinir localmente \FBthinspacepara não fazer 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} 

Saída:

insira a descrição da imagem aqui

informação relacionada