
babel
的選項透過使其前面自動帶有.frenchb
來啟動eg字元。的書籤部分正確支援此類活動字元。但是,當我嘗試使用規範創建自己的節命令時,這會導致眾所周知的警告,如以下 MWE 所指出的:!
\thinspace
hyperref
\addcontentsline
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding)
\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 (並且如果您在 vmode 中時\par
前面沒有文字),則警告會消失:\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}
輸出: