%20Abschnittsbefehlen..png)
babel
Die Option von frenchb
aktiviert das eg- !
Zeichen, indem sie automatisch ein voranstellt \thinspace
. Solche aktiven Zeichen werden in Abschnitten durch hyperref
die Lesezeichen von richtig unterstützt. Wenn ich jedoch versuche, meinen eigenen Abschnittsbefehl mit einer \addcontentsline
Spezifikation 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:
- es gibt keine Warnung, wenn ich
\textbf{#1}%
in diesem benutzerdefinierten Abschnitt den Befehl entferne: ziemlich seltsam ... bookmark
Paket hilft hier nicht.
Antwort1
Es ist nicht hyperref, das das Argument bereinigt. Der Hauptunterschied zwischen \section
und Ihrem Befehl besteht darin, dass das \addcontentsline
fü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, \addcontentsline
da 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, \FBthinspace
um 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: