我想在\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}
并且它确实满足了我的要求
- 为什么
\whyIsThisNeeded
需要? - 我如何查询之前的“bookmarksdepth”并在之后重置它?
- 我是否真的需要
\chapter\section\sub...
单独重新定义所有命令? - 我如何以 的形式定义命令
\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}
如果某些键未使用,则使用强制参数中的章节标题。其他部分单元可进行类似的定义。