![执行](https://linux22.com/image/331458/%E6%89%A7%E8%A1%8C.png)
我想在每个部分|小节|子小节|段落的底部制作一个导航菜单。
此文档将嵌入到应用程序的二进制文件中。这是用户单击帮助时将看到的内容。由于此文档的性质(太长,无法打印,但能打印)它应该为使用鼠标的观众提供一些导航帮助。
beamer
我设想在每张幻灯片的底部放置一些类似于班级导航菜单的东西。article
不过,我正在使用这个班级(尽管经过了大量修改)。
当我搜索这个的时候,我发现
- 文档内的自动超链接?(仅与目录相关,与章节末尾的自动“返回顶部”链接无关)
执行
请注意,我将使用 POSIX 目录符号来表示父部分(.. 和 ../..)。实现可能需要菜单宏,其中包含一些 if/then 逻辑,可以检测该部分是否有父部分,以确定“跳转 ../..”按钮是否应该可见或至少应明显禁用。定义titlesec
需要有钩子,以便可以创建到父部分(..)和父父部分(../..)的自动链接。
我需要能够
- 使用静态链接引用目录完毕
- 动态引用父级 .. 部分(可能可以使用获取当前 \label 的值)
- 动态引用父级 ../.. 部分
- 参考上一页
\thepage - 1
完毕 - 参考下页
\thepage + 1
完毕
模型实施
\documentclass{article}
\usepackage{fontspec}
\usepackage{lipsum}
\usepackage[compact,explicit,noindentafter]{titlesec}
\usepackage{fancyhdr}
\usepackage{xcolor}
\usepackage[hidelinks]{hyperref}
\usepackage{amsmath,amssymb}
\fancypagestyle{digitalpage} % This style could inject the implementation of the navigation menu into titlesec definitions maybe (so that it can be toggled easily)?
{
\fancyhf{} % clear all fields
\renewcommand{\headrulewidth}{0pt}
\lhead{}
\lfoot{}
\cfoot{}
\rfoot{%
\bfseries\footnotesize\thepage
}%
}%
\newcommand\navigationmenu{\vspace{1ex}\noindent\footnotesize\textcolor{gray}{\sffamily Jump to Contents $\Uparrow$} | \textcolor{gray}{\hyperlink{sub}{\sffamily Jump .. $\uparrow$}} | \textcolor{gray}{\hyperlink{sec}{\sffamily Jump ../.. $\upuparrows$}} | \textcolor{gray}{\sffamily $\leftarrow$ Previous Page} | \textcolor{gray}{\sffamily $\rightarrow$ Next Page}} % contains some logic, if section has no ../.., don't reveal.
% SECTION
\titleformat{\section}[hang]{\Huge\bfseries}{\thesection}{1cm}{#1}[\thispagestyle{digitalpage}]
% SUBSECTION
\titleformat{\subsection}[hang]{\Large\bfseries}{\thesubsection}{1cm}{#1}
\begin{document}
\hypertarget{sec}{\section{Something}}
\lipsum[1]
\navigationmenu
\hypertarget{sub}{\subsection{Something something}}
\lipsum[2]
\navigationmenu
\end{document}
输出
答案1
这是一个解决方案。
我们的想法是重新定义\ttl@useclass
以获取有关我们正在开始的分段级别的信息,以便我们可以准备下一个分段navigationmenu
,并在开始新的分段之前顺便显示navigationmenu
预览部分。
\renewcommand*\ttl@useclass[2]{%
\ifnum\@nameuse{ttll@#2}>\c@secnumdepth\relax\stepcounter{mtpar}\fi%
\displaynavigationmenu%
\renewcommand*\displaynavigationmenu{\navigationmenu{#2}}%
\oldttl@useclass{#1}{#2}}
笔记
- 假设的默认值
secnumdepth
是,因此如果更改此值,则需要更改代码(可能稍后完成) \navigationmenu
由于字体大小改变而定义中使用的分组。- 为避免
navigationmenu
在下一页顶部出现此情况,添加了 nobreak。 - 内容、预览页和下一页不在这里考虑(OP 已经完成)。
\documentclass{article}
\usepackage{lipsum}
\usepackage[compact,explicit,noindentafter]{titlesec}
\usepackage{fancyhdr}
\usepackage{xcolor}
\usepackage[hidelinks]{hyperref}
\usepackage{amsmath,amssymb}
\fancypagestyle{digitalpage} % This style could inject the implementation of the navigation menu into titlesec definitions maybe (so that it can be toggled easily)?
{
\fancyhf{} % clear all fields
\renewcommand{\headrulewidth}{0pt}
\lhead{}
\lfoot{}
\cfoot{}
\rfoot{%
\bfseries\footnotesize\thepage
}%
}%
\newcommand*\displaynavigationmenu{}
\newcounter{mtpar}% global counter for paragraphs
\makeatletter
\newcommand{\mtlink}[2]{%
\ifnum\@nameuse{ttll@#1}>\c@secnumdepth\relax% % if parent .. section is paragraph
\textcolor{gray}{\hyperlink{#1*.\themtpar}{\sffamily Jump .. $\uparrow$}} |
\else% % if parent .. section is (sub...)section
\textcolor{gray}{\hyperlink{#1.\csname the#1\endcsname}{\sffamily Jump .. $\uparrow$}} |
\fi
\ifnum\value{#2}>0% % if parent parent ../.. section exist
\textcolor{gray}{\hyperlink{#2.\csname the#2\endcsname}{\sffamily Jump ../.. $\upuparrows$}} |
%\else
%no parant ../.. here
\fi}
\newcommand\navigationmenu[1]{%
\begingroup
\nobreak\vspace{1ex}\nobreak
\noindent\footnotesize\textcolor{gray}{\sffamily Jump to Contents $\Uparrow$} |
\ifcase\@nameuse{ttll@#1}\or
\mtlink{section}{part}\or
\mtlink{subsection}{section}\or
\mtlink{subsubsection}{subsection}\or
\mtlink{paragraph}{subsubsection}\fi
\textcolor{gray}{\sffamily $\leftarrow$ Previous Page} |
\textcolor{gray}{\sffamily $\rightarrow$ Next Page}
\endgroup}
\let\oldttl@useclass\ttl@useclass
\renewcommand*\ttl@useclass[2]{%
\ifnum\@nameuse{ttll@#2}>\c@secnumdepth\relax\stepcounter{mtpar}\fi%
\displaynavigationmenu%
\renewcommand*\displaynavigationmenu{\navigationmenu{#2}}%
\oldttl@useclass{#1}{#2}}
\makeatother
\AtEndDocument{\displaynavigationmenu}% for the last ...section
% SECTION
\titleformat{\section}[hang]{\Huge\bfseries}{\thesection}{1cm}{#1}[\thispagestyle{digitalpage}]
% SUBSECTION
\titleformat{\subsection}[hang]{\Large\bfseries}{\thesubsection}{1cm}{#1}
\begin{document}
\section{Something}
\lipsum[1]
\subsection{Something something}
\lipsum[2]
\paragraph{Something foo}
\lipsum[3]
\subsection{Something something else}
\lipsum[3]
\subsubsection{Something something foo}
\lipsum[3]
\paragraph{Something foo}
\lipsum[3]
\end{document}