\chapter 的第二个可选输入用于重命名书签

\chapter 的第二个可选输入用于重命名书签

我想在\chapter的定义中包含第二个可选参数,以便能够为书签赋予一个与目录中显示的名称不同的名称。

原因在于目录中可以排版子标和上标,而书签中却无法排版。

这是我的解决方法

\documentclass{report}
\usepackage{hyperref,bookmark}
\usepackage{ifthen,twoopt}

\def\whyIsThisNeeded{
  \let\origchap\chapter
  \let\origsec\section

  \renewcommandtwoopt\chapter[3][toc][bm]{
    \hypersetup{bookmarksdepth=-2}
    \ifthenelse{\equal{##1}{toc}}{\def\ontoc{##3}}{\def\ontoc{##1}}
    \ifthenelse{\equal{##2}{bm}}{\def\inbm{##3}}{\def\inbm{##2}}

    \origchap[\ontoc]{##3}
    \phantomsection\pdfbookmark[0]{\inbm}{\inbm}
    \hypersetup{bookmarksdepth=2}
    }
  \renewcommandtwoopt\section[3][toc][bm]{
    \hypersetup{bookmarksdepth=-2}
    \ifthenelse{\equal{##1}{toc}}{\def\ontoc{##3}}{\def\ontoc{##1}}
    \ifthenelse{\equal{##2}{bm}}{\def\inbm{##3}}{\def\inbm{##2}}

    \origsec[\ontoc]{##3}
    \phantomsection\pdfbookmark[1]{\inbm}{\inbm}
    \hypersetup{bookmarksdepth=2}
    }
}

\begin{document}
\tableofcontents
\whyIsThisNeeded
\chapter[1st chapter on toc][chapter 1]{first chapter in document}
\section[section on toc][section bookmark]{section in doc}
\chapter[2nd chapter on toc][chapter 2]{second chapter in document}
\end{document}

并且它确实满足了我的要求

  1. 为什么\whyIsThisNeeded需要?
  2. 我如何查询之前的“bookmarksdepth”并在之后重置它?
  3. 我是否真的需要\chapter\section\sub...单独重新定义所有命令?
  4. 我如何以 的形式定义命令\chapter[toc-name]{doc-name}[bm-name]

答案1

我建议使用键值语法,而不是增加可选参数:

\documentclass{book}
\usepackage{xparse}
\usepackage{kantlipsum}
\usepackage{hyperref,bookmark}

\ExplSyntaxOn
\keys_define:nn { roepo/chapter }
 {
  toc .tl_set:N = \l_roepo_chapter_toc_tl,
  bookmark .tl_set:N = \l_roepo_chapter_bookmark_tl,
  header .tl_set:N = \l_roepo_chapter_header_tl,
 }

\NewDocumentCommand{\Chapter}{sO{}m}
 {
  \IfBooleanTF{#1}
   {
    \chapter*{#3}
   }
   {
    \roepo_chapter:nn { #2 } { #3 }
   }
 }
\cs_new_protected:Npn \roepo_chapter:nn #1 #2
 {
  \tl_set:Nn \l_roepo_chapter_toc_tl { #2 }
  \tl_set:Nn \l_roepo_chapter_bookmark_tl { #2 }
  \tl_set:Nn \l_roepo_chapter_header_tl { #2 }
  \keys_set:nn { roepo/chapter } { #1 }
  \chapter
   [\texorpdfstring{\l_roepo_chapter_toc_tl}{\l_roepo_chapter_bookmark_tl}]
   {#2}
   \chaptermark{\l_roepo_chapter_header_tl}
 }
\ExplSyntaxOff

\begin{document}

\frontmatter
\tableofcontents

\mainmatter
\Chapter[
  toc=Short title for toc,
  header=Short for head,
  bookmark=A long title with f(x),
]{A long title with $f(x)$}

\section{A section}

\kant
\end{document}

如果某些键未使用,则使用强制参数中的章节标题。其他部分单元可进行类似的定义。

在此处输入图片描述

相关内容