如何模仿美观的 Motion Mountain ToC,包括超链接?

如何模仿美观的 Motion Mountain ToC,包括超链接?

我想自定义我的目录,让它看起来或多或少像运动山物理教科书,包括可点击的页码。我决定使用hyperreftitletoc包。现在看来,这两者(我猜)的兼容性存在问题。

背景。我的 -class 文档的目录article仅显示章节和子章节。章节(带标签/编号和不带标签/编号的)应使用 basic 格式\titlecontents,而子章节应使用带星号的版本。看起来后者是导致链接错误的原因。

问题。每当给定节位于带有子节的节之后时,前者就会错误地链接到这些子节中的第一个。其他所有节和所有子节均正常。

梅威瑟:

\documentclass{article}

\usepackage[cp1250]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{titletoc}
    \titlecontents{section}[.5pc]%
        {\addvspace{.5pc}\normalsize\makebox[2pc][r]{\thecontentspage\hspace{1pc}}}%
        {\makebox[2.5pc][r]{\thecontentslabel\hspace{1pc}}}%
        {\makebox[2.5pc][r]{\null}}%
        {}%
% comment this starred part and it does work...
    \titlecontents*{subsection}[6.5pc]%
        {\small}{}{}%
        {\hspace{5pt}\thecontentspage}%
        [\ \textbullet\ ]

\usepackage[colorlinks,linktoc=page]{hyperref}


\begin{document}

% Frontmatter - only unnumbered/unlabeled sections
\pagenumbering{roman}
    \section*{Frontmatter Section Pre-TOC}

    % TOC ...goes to TOC.
    \clearpage
    \phantomsection
    \addcontentsline{toc}{section}{\contentsname}
    \tableofcontents

    \clearpage
    \phantomsection
    \section*{Frontmatter Section 1}
    \addcontentsline{toc}{section}{Frontmatter Section 1}

    \clearpage
    \phantomsection
    \section*{Frontmatter Section 2}
    \addcontentsline{toc}{section}{Frontmatter Section 2}

% Mainmatter - only numbered/labeled sections
\clearpage
\pagenumbering{arabic}
    \clearpage
    \section{Section 1}
        \subsection{Subsection 1.1}
        \subsection{Subsection 1.2}
        \subsection{Subsection 1.3}

    \clearpage
    \section{Section 2}

    \clearpage
    \section{Section 3}
        \subsection{Subsection 3.1}
        \subsection{Subsection 3.2}

    \clearpage
    \section{Section 4}
        \subsection{Subsection 4.1}
        \subsection{Subsection 4.2}
        \subsection{Subsection 4.3}
        \subsection{Subsection 4.4}
        \subsection{Subsection 4.5}

    \clearpage
    \section{Section 5}

    \clearpage
    \section{Section 6}
        \subsection{Subsection 6.1}
        \subsection{Subsection 6.2}
        \subsection{Subsection 6.3}

% Backmatter - all (sub)sections w/o labels
    \clearpage
    \phantomsection
    \section*{Backmatter Section 1}
    \addcontentsline{toc}{section}{Backmatter Section 1}
        \phantomsection
        \subsection*{Backmatter Subsection 1.1}
        \addcontentsline{toc}{subsection}{Backmatter Subsection 1.1}

        \phantomsection
        \subsection*{Backmatter Subsection 1.2}
        \addcontentsline{toc}{subsection}{Backmatter Subsection 1.2}

    \clearpage
    \phantomsection
    \section*{Backmatter Section 2}
    \addcontentsline{toc}{section}{Backmatter Section 2}

    \clearpage
    \phantomsection
    \section*{Backmatter Section 3}
    \addcontentsline{toc}{section}{Backmatter Section 3}

\end{document}

因此看起来这一切都是由星号引起的\titlecontents*……

我添加\clearpages 只是为了延长输出文件并添加一些页面,这不会改变其他任何东西。

提前感谢你帮助我解决这个问题。

编辑: 也许一个可能的解决方法是使用etoolbox带有自定义计数器的列表,很可能也带有自定义链接?

编辑2: 有没有人至少设法用给定的 MWE 重现了错误?;-) 我知道这hyperref没什么大不了的titletoc,但不知道它们在多大程度上是不兼容的。换句话说,我的问题是一个常见问题吗?或者可能恰恰相反:过于本地化? 这个问题的答案对我来说也意义重大 :-)

总结一下:这似乎都是关于星号titlecontents*宏的一些问题。所有链接都可以使用经典的——只有当您将 ToC 条目分组到一个段落中时才会变得混乱......

我做了一些胆怯的尝试来解决这个问题,找到了一些例子并取得了一些进展......现在我明白了hyperref,这只是分组目录中的链接算法出了问题。起初我titletoc只是责怪,所以尝试使用其他工具使我的目录看起来一样。那当然至少可以说,这是一个死路。链接每次都是以同样的方式出错。我感到很无助...

无论如何,也许有人可以帮我一下,尝试处理这些链接仅此而已?我会很感激哪怕最微小的反馈 :-)

答案1

我的解决方案是这样的(我实际上扩展了它以包括子部分):

  1. 加载hyperref无目录链接(选项linktoc=none)以手动定义它们。在这里我决定章节应该链接到它们开始的整个页面,而子章节则正常链接。

  2. 为数字子部分定义自定义计数器 - 仅供参考,仅用于主要事项。

  3. 使用自定义部分目录条目titletoc(这样更容易)。

  4. 借助一些切换按钮,分别重新定义\l@subsection和自定义子部分和子子部分的目录条目。我可以使用自定义这些条目,但它们不会对齐,因此看起来会更糟糕。\l@subsubsectionetoolboxtitletoc

  5. 最后,切换\hypersetup{linktoc=page}以便图表列表等页面上的链接能够正常工作。


代码:

\documentclass[12pt]{article}

\usepackage[cp1250]{inputenc}
\usepackage{lmodern}        % for the looks
\usepackage{biolinum}       % for the looks
\usepackage[T1]{fontenc}

\usepackage{etoolbox}
\usepackage{titletoc}
\usepackage[colorlinks,linktoc=none]{hyperref}


\newcounter{numSubSection}
    \setcounter{numSubSection}{0}

\gpreto{\subsection}{%
    \refstepcounter{numSubSection}}%


\titlecontents{section}[0pt]%
    {\addvspace{6pt}\sffamily\bfseries\normalsize%
        \makebox[18pt][r]{%
            \hyperlink{page.\thecontentspage}{\textbf{\thecontentspage}}%
            \hspace{6pt}}}%
    {\makebox[30pt][r]{\thecontentslabel\hspace{12pt}}}%
    {\makebox[30pt][r]{\null}}%
    {}%


\makeatletter

\newlength{\TOCleftSkip}
    \setlength{\TOCleftSkip}{66pt}%
\newlength{\TOCrightSkip}
    \setlength{\TOCrightSkip}{18pt}%

\newtoggle{ifSub}
    \togglefalse{ifSub}%
\newtoggle{ifSection}
    \toggletrue{ifSection}%
\newcounter{RefSubSection}%
    \setcounter{RefSubSection}{0}%
    \renewcommand*\theRefSubSection{\@arabic\c@RefSubSection}%

\renewcommand*{\tableofcontents}{%
    \section*{\contentsname}%
    \addcontentsline{toc}{section}{\contentsname}%
    \toggletrue{ifSection}%
    \setcounter{RefSubSection}{0}%
    \@starttoc{toc}}%

\gpreto{\l@section}{%
    \nottoggle{ifSection}
        {\par%
            \addtolength{\leftskip}{-\TOCleftSkip}%
            \addtolength{\rightskip}{-\TOCrightSkip}%
            \togglefalse{ifSub}}{}%
    \toggletrue{ifSection}}%

\renewcommand*{\l@subsection}[2]{%
    \stepcounter{RefSubSection}%
    \toggletrue{ifSub}%
    \iftoggle{ifSection}
        {\togglefalse{ifSection}%
            \addtolength{\leftskip}{\TOCleftSkip}%
            \addtolength{\rightskip}{\TOCrightSkip}%
            \noindent}%
        {\unskip\begingroup\upshape\small\ \textbullet~\endgroup}%
    \begingroup%
        \upshape\small#1\ \hyperlink{numSubSection.\theRefSubSection}{\textbf{#2}}%
    \endgroup}%

\renewcommand*{\l@subsubsection}[2]{%
    \iftoggle{ifSection}
        {\togglefalse{ifSection}%
            \addtolength{\leftskip}{\TOCleftSkip}%
            \addtolength{\rightskip}{\TOCrightSkip}%
            \noindent}%
        {\iftoggle{ifSub}
            {\togglefalse{ifSub}\relax%
                \unskip\begingroup\upshape\small:\ \endgroup}%
            {\unskip\begingroup\itshape\small,\ \endgroup}}%
    \begingroup\itshape\small#1\endgroup}%

\renewcommand*{\numberline}[1]{}%

\makeatother


% solution ends here, code below is just for the example
\begin{document}

% Frontmatter - only unnumbered/unlabeled sections
\pagenumbering{roman}
    \clearpage
    \tableofcontents

    \clearpage
    \section*{Preface}
    \addcontentsline{toc}{section}{Preface}

    \clearpage
    \section*{Another Preface}
    \addcontentsline{toc}{section}{Another Preface}


% Mainmatter - only numbered/labeled sections
    \clearpage
    \addtocontents{toc}{\protect\vspace{18pt}}       % just some separation
    \pagenumbering{arabic}
    %\clearpage
    \section{First}
        \subsection{Australia}
            \subsubsection{Alpha}
            \subsubsection{Beta}
            \subsubsection{Charlie}
            \subsubsection{Delta}
            \subsubsection{Echo}
            \subsubsection{Foxtrot}
        \subsection{Brazil}
            \subsubsection{Golf}
            \subsubsection{Hotel}
            \subsubsection{India}
        \subsection{Canada}

    \clearpage
    \section{Second}

    \clearpage
    \section{Third}
        \subsection{Denmark}
            \subsubsection{Juliet}
            \subsubsection{Kilo}
            \subsubsection{Lima}
            \subsubsection{Mike}
            \subsubsection{November}
        \subsection{Egypt}
            \subsubsection{Oscar}
            \subsubsection{Papa}
            \subsubsection{Quebec}
            \subsubsection{Romeo}

    \clearpage
    \section{Fourth}
        \subsection{Georgia}
            \subsubsection{Sierra}
        \subsection{Haiti}
            \subsubsection{Tango}
            \subsubsection{Uniform}
            \subsubsection{Victor}
            \subsubsection{Whiskey}
        \subsection{Iceland}
        \subsection{Japan}
            \subsubsection{X-ray}
            \subsubsection{Yankee}
            \subsubsection{Zulu}
            \subsubsection{Alpha}
            \subsubsection{Beta}
            \subsubsection{Charlie}
            \subsubsection{Delta}
            \subsubsection{Echo}
        \subsection{Kenya}
            \subsubsection{Foxtrot}
        \subsection{Laos}
            \subsubsection{Golf}
            \subsubsection{Hotel}
            \subsubsection{India}
            \subsubsection{Juliet}
            \subsubsection{Kilo}


% Backmatter - all (sub)sections w/o labels
    \clearpage
    \addtocontents{toc}{\protect\vspace{18pt}}       % just some separation
    \hypersetup{linktoc=page}
    \section*{References}
    \addcontentsline{toc}{section}{References}

    \clearpage
    \section*{List of Figures}
    \addcontentsline{toc}{section}{List of Figures}

    \clearpage
    \section*{Index}
    \addcontentsline{toc}{section}{Index}

\end{document}

这很可能可以做得更容易/更漂亮,但至少它完成了工作。希望一切都很清楚 ;-)


该代码翻译过来就是这个样子:

在此处输入图片描述

相关内容