我正在扩展一个课程,以便记下康奈尔风格的笔记。为此,该课程严重依赖于tcolorboxes
。我想为其中一些内容在生成的 PDF 中添加书签tcolorboxes
,但无论我如何尝试,书签都会跳转到错误的位置。
以下是课程内容:
\ProvidesClass{cornell}
\LoadClass[a4paper]{article}
\usepackage{tcolorbox}
\tcbuselibrary{breakable,skins,xparse}
\usepackage[margin=2cm]{geometry} % Change geometry of pages
\usepackage{bookmark} % Add bookmarks to the resulting PDF
\usepackage{hyperref}
\hypersetup{
colorlinks = true, % Colour links instead of ugly boxes
urlcolor = blue, % Colour for external hyperlinks
linkcolor = blue, % Colour of internal links
citecolor = red % Colour of citations
bookmarks = true
}
\date{}
\renewcommand{\maketitle}{%
\vspace{-3em}
\pdfbookmark[0]{\@title}{title}
\begin{tcolorbox}[width=\textwidth,lowerbox=invisible]
\Huge\sffamily \@title
\end{tcolorbox}
% \vspace{2em}
}
\NewDocumentEnvironment{extra}{m}
{
\pdfbookmark[1]{#1}{extra}
\begin{tcolorbox}[
width=\textwidth,
colframe=black,
colupper=black,
opacitybacktitle=1,
opacitytext=1,
segmentation style={black!55,solid,opacity=0,line width=3pt},
fonttitle=\large\bfseries\sffamily,
title=#1,
]
}
{
\end{tcolorbox}
}
\NewDocumentEnvironment{note}{o}
{
\IfNoValueT{#1} {
\vspace{-1em}
}{}
\begin{tcolorbox}[
enhanced,
breakable,
enlarge left by=.34\textwidth,
width=.66\textwidth,
overlay={
\IfNoValueF{#1} {
\pdfbookmark[1]{#1}{note}
\node[anchor=north west, outer sep=0pt, inner sep=0pt] at ([xshift=-.34\textwidth]frame.north west) {\begin{tcolorbox}[width=.325\textwidth]#1\end{tcolorbox}};
}{}
}
]
}
{
\end{tcolorbox}
}
\NewDocumentEnvironment{summary}{}
{
\vfill
\pdfbookmark[1]{Summary}{summary}
\begin{tcolorbox}[
floatplacement=!b,
float,
colframe=black,
colupper=black,
opacitybacktitle=1,
opacitytext=1,
segmentation style={black!55,solid,opacity=0,line width=3pt},
fonttitle=\large\bfseries\sffamily,
title=Summary,
]
}
{
\end{tcolorbox}
}
以下是一个示例:
\documentclass{cornell}
\usepackage{lipsum}
\title{A topic we're taking notes on}
\begin{document}
\maketitle
\begin{extra}{Introduction}
This can be used to introduce what is about to come, like
\begin{enumerate}
\item{What's the first question this section will answer?}
\item{What's the second question?}
\end{enumerate}
\end{extra}
\begin{note}[Some key term]
\begin{itemize}
\item{A cool thing}
\item{Another cool thing}
\item{Not all things are cool}
\end{itemize}
That has another paragraph.
\end{note}
\begin{summary}
A fabulous summary.
\\\\
With multiple paragraphs.
\end{summary}
\begin{extra}{Second introduction}
This is another introduction to a related yet different section.
\end{extra}
\begin{note}[Another term]
\lipsum[4]
\end{note}
\begin{note}
\lipsum[5]
\end{note}
\begin{note}
\lipsum[6-7]
\end{note}
\end{document}
答案1
唯一目的地名称
\pdfbookmark
包中的宏hyperref
还定义了一个用作书签目标的锚点。目标名称必须是唯一的。最后一个参数\pdfbookmark
用于提供唯一名称。由于该类定义了多个可多次使用的cornell
实体(环境,...),因此计数器有助于确保唯一性。note
反申报:
\newcounter{BkmCornell} \renewcommand*{\theBkmCornell}{\the\value{BkmCornell}}
宏
\theBkmCornell
被重新定义为扩展为纯 ASCII 数字。(默认定义\theBkmCornell
在\arabic
大多数情况下也适用,但在某些语言中可能会重新定义。)计数器在之前递增
\pdfbookmark
,例如对于内部环境note
:\stepcounter{BkmCornell}% \pdfbookmark[1]{#1}{note\theBkmCornell}%
百分号可以避免行尾空格带来的麻烦。
书签的放置
最佳位置是实体的左上角。
例如,书签可以垂直放置在包含实体的框之前。缺点是需要小心防止书签和包含实体的框之间出现分页符。如果实体是一个在其开头添加分页点的环境,这可能会很棘手。
例如,书签不应在可以浮动的环境(环境
figure
、table
或float
环境 的选项tcolorbox
)之前使用。在这种情况下,书签必须进入环境,请参阅下一项。另一种方法是将书签包含在实体框内,但将其移动到左上角。环境示例
note
:\begin{tcolorbox}[ % ..., enhanced, overlay={% \stepcounter{BkmCornell}% \node[inner sep=0pt, outer sep=0pt] at (frame.north west) {\pdfbookmark[1]{#1}{note\theBkmCornell}};% }, ]
答案2
我在tcolorbox 文档。只要加载包,bookmark
就可以给 a 提供一个选项。它会自动添加 a。tcolorbox
bookmarks
pdfbookmark
我必须使用该bookmark*
选项才能手动设置书签的级别。
举个例子,下面是标题的定义:
\renewcommand{\maketitle}{%
\vspace{-3em}
\begin{tcolorbox}[
width=\textwidth,
lowerbox=invisible,
bookmark*={level=0}{\@title}
]
\Huge\sffamily \@title
\end{tcolorbox}
}
书签标签的唯一性似乎是tcolorbox
自动处理的。