\section 中的 PDF 字串中允許使用標記,但自訂(使用 \addcontentsline)部分命令中不允許使用標記

\section 中的 PDF 字串中允許使用標記,但自訂(使用 \addcontentsline)部分命令中不允許使用標記

babel的選項透過使其前面自動帶有.frenchb來啟動eg字元。的書籤部分正確支援此類活動字元。但是,當我嘗試使用規範創建自己的節命令時,這會導致眾所周知的警告,如以下 MWE 所指出的:!\thinspacehyperref\addcontentslinePackage 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}

為了消除此警告,我的(故意天真的)自訂部分命令中缺少什麼?

順便一提:

  1. \textbf{#1}%如果我在此自訂部分命令中刪除,則不會出現任何警告:相當奇怪...
  2. 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} 

輸出:

在此輸入影像描述

相關內容