babel
选项frenchb
使 eg!
字符自动以 开头,从而使\thinspace
eg 字符变为活动字符。 书签在部分中正确支持此类活动字符hyperref
。 但是,当我尝试使用规范创建自己的部分命令时\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 !
如果您插入一个,警告就会消失\par
(并且如果在 vmode 下,在之前没有文本\addcontentsline
):
\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}
输出: