%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B5%20section.png)
babel
's frenchb
option делает активным !
символ eg, автоматически предваряя его \thinspace
. Такие активные символы правильно поддерживаются в разделах hyperref
закладками 's. Но когда я пытаюсь создать свою собственную команду section со спецификацией \addcontentsline
, это приводит к хорошо известному Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding)
предупреждению, как указано в следующем 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}
Чего не хватает в моей (намеренно наивной) настроенной команде раздела, чтобы избавиться от этого предупреждения?
КСТАТИ:
- нет никакого предупреждения, если я удалю
\textbf{#1}%
в этом пользовательском разделе команду: довольно странно... bookmark
пакет здесь не поможет.
решение1
Это не hyperref, который очищает аргумент. Главное отличие между \section
и вашей командой в том, что \addcontentsline
выдается для первого в вертикальном режиме. А определение ! зависит от режима:
\french@sh@!@ ->\ifhmode \ifdim \lastskip >\z@ \unskip \penalty \@M \FBthinspace
\else \FDP@thinspace \fi \fi \string !
Предупреждение исчезнет, если вы вставите a \par
(а также если перед a нет текста, \addcontentsline
так как вы находитесь в 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}
решение2
Вы можете локально переопределить, \FBthinspace
чтобы ничего не делать.
\newcommand{\mynaivesection}[1]{%
\textbf{#1}%
\begingroup%
\renewcommand{\FBthinspace}{}%
\addcontentsline{toc}{section}{#1}%
\endgroup%
}
МВЭ:
\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}
Выход: