与 tcolorboxes 一起使用时,手动设置书签跳转到错误位置

与 tcolorboxes 一起使用时,手动设置书签跳转到错误位置

我正在扩展一个课程,以便记下康奈尔风格的笔记。为此,该课程严重依赖于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

  1. 反申报:

    \newcounter{BkmCornell}
    \renewcommand*{\theBkmCornell}{\the\value{BkmCornell}}
    

    \theBkmCornell被重新定义为扩展为纯 ASCII 数字。(默认定义\theBkmCornell\arabic大多数情况下也适用,但在某些语言中可能会重新定义。)

  2. 计数器在之前递增\pdfbookmark,例如对于内部环境note

    \stepcounter{BkmCornell}%
    \pdfbookmark[1]{#1}{note\theBkmCornell}%
    

    百分号可以避免行尾空格带来的麻烦。

书签的放置

最佳位置是实体的左上角。

  • 例如,书签可以垂直放置在包含实体的框之前。缺点是需要小心防止书签和包含实体的框之间出现分页符。如果实体是一个在其开头添加分页点的环境,这可能会很棘手。

    例如,书签不应在可以浮动的环境(环境figuretablefloat环境 的选项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。tcolorboxbookmarkspdfbookmark

我必须使用该bookmark*选项才能手动设置书签的级别。

举个例子,下面是标题的定义:

\renewcommand{\maketitle}{%
    \vspace{-3em}
    \begin{tcolorbox}[
        width=\textwidth,
        lowerbox=invisible,
        bookmark*={level=0}{\@title}
    ]
        \Huge\sffamily \@title
    \end{tcolorbox}
}

书签标签的唯一性似乎是tcolorbox自动处理的。

相关内容