Token sind in PDF-Zeichenfolgen in \section zulässig, jedoch nicht in benutzerdefinierten (mit \addcontentsline) Abschnittsbefehlen.

Token sind in PDF-Zeichenfolgen in \section zulässig, jedoch nicht in benutzerdefinierten (mit \addcontentsline) Abschnittsbefehlen.

babelDie Option von frenchbaktiviert das eg- !Zeichen, indem sie automatisch ein voranstellt \thinspace. Solche aktiven Zeichen werden in Abschnitten durch hyperrefdie Lesezeichen von richtig unterstützt. Wenn ich jedoch versuche, meinen eigenen Abschnittsbefehl mit einer \addcontentslineSpezifikation zu erstellen, führt dies zu der bekannten Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding)Warnung, wie im folgenden MWE gezeigt:

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

Was fehlt in meinem (absichtlich naiven) angepassten Abschnittsbefehl, um diese Warnung loszuwerden?

Übrigens:

  1. es gibt keine Warnung, wenn ich \textbf{#1}%in diesem benutzerdefinierten Abschnitt den Befehl entferne: ziemlich seltsam ...
  2. bookmarkPaket hilft hier nicht.

Antwort1

Es ist nicht hyperref, das das Argument bereinigt. Der Hauptunterschied zwischen \sectionund Ihrem Befehl besteht darin, dass das \addcontentslinefür das erste im vertikalen Modus ausgegeben wird. Und die Definition des ! hängt vom Modus ab:

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

Die Warnung verschwindet, wenn Sie ein einfügen \par(und auch, wenn davor kein Text steht, \addcontentslineda Sie sich dann im vmode befinden):

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

Antwort2

Sie können lokal neu definieren, \FBthinspaceum nichts zu tun.

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

Ausgabe:

Bildbeschreibung hier eingeben

verwandte Informationen