我正在为学生完成一本相当长的书(约 2000 页)。这本书的每一章都有一节问题和一节相应的答案。有些问题很复杂,有些答案又长又详细。因此,学生们在电子书草稿中评论说,他们希望有链接,可以从答案文本跳转到问题(在上一节中),然后再跳转回来。
由于我不是 LaTeX 程序员,我计划使用双重引用:问题点和答案点的标签以及由 hyperref 提供的相应超链接。这并不完美,但应该会很有帮助,而且基本上有效。
但是,有一个功能我还没有能够正确实现。在答案部分,我想在标题中添加一个额外的超链接,链接回页面上的文本所回答的问题。这样做的原因是,有些答案大约有 30 页长,在答案文本顶部找到反向链接会相当不方便。
为此,我实现了一个开关,当我告诉 LaTeX 这样做时(在答案部分),它会激活标题链接。此外,最后一个标签存储在一个宏中。当在答案部分设置新的“跳转”时,存储的标签应该复制到“\previouslabel”宏中,然后由标题命令读取。这个想法是,标题中的链接指向讨论的答案的问题在页面开头(因为无论如何,新的答案都会从该页面上的反向链接开始)。
然而,这实际上不起作用。正如 MWE 所示,标题将链接指向最后的该页面上讨论的问题,并且当答案以该页面结束时,它甚至会链接到下一页的答案。
我非常肯定
\renewcommand{\previouslabel}{\recentlabel}
是问题的一部分,使用“let”或“edef”可能会更好,但我没有成功,迷失在无数的 TeX 中。但问题也可能来自标题的设置(我不知道 LaTeX 在什么时候决定其内容)。
我也尝试过将标签存储到单独的文件或 scontents 中,但无济于事(我是书籍作者,不是 LaTeX 专家)。shipout 包(everyshi、atbegshi)也是如此。一般来说,在存储标签(或字符串)方面我感到有点迷茫:LaTeX 中是否存在不干扰 TeX 内部的“最佳实践”?
我想坚持使用“真正的”标签和超链接,因为我在其他情况下也需要标签(因此我避免使用 \hyperlink 和 \hypertarget)。
这是我的 MWE。请忽略 komascript 的弃用警告;另外,我还没有注意到打印第一个答案时 \previouslabel 为空的情况。
我们非常欢迎任何帮助。还有任何关于如何存储标签和字符串的建议。
此致
鲤属
[我的第一篇帖子,不是母语人士。请耐心等待]
梅威瑟:
\documentclass[%
12pt,
twoside=false,
cleardoublepage=empty,
open=right, %
parskip=half*, %
headings=normal, %
numbers=noenddot, %
chapterprefix=true,%
]{scrbook}
\usepackage[a4paper, width=15.6cm, height=24.5cm, includehead=false,%
top=2.5cm, bottom=2cm, headsep=0.8cm,%
inner=2.5cm, outer=4.5cm,%
marginparsep=.5cm, marginparwidth=1.5cm,%
]{geometry}
\usepackage{marginnote,calc}
\usepackage{ifthen,ragged2e}
\usepackage{blindtext}
%% Headlines and Footlines
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[headsepline]{scrlayer-scrpage} \pagestyle{scrheadings}
\clearscrheadfoot
\setheadwidth[0pt]{textwithmarginpar}
\setheadsepline{.5pt}
\setfootwidth{\textwidth}
\ohead{\pagemark% Pagenumbers
\ifthenelse{\boolean{JumpBackOn}}
{ – \hyperref[\previouslabel]{up to \previouslabel}}% set jumpback in headline
}%
\ihead{\headmark}
% Jumping commands
\newboolean{JumpBackOn} %switch for headlines
\setboolean{JumpBackOn}{false}
\newcommand{\recentlabel}{} %
\newcommand{\previouslabel}{} %
\newcommand{\JumpBackOn}{\setboolean{JumpBackOn}{true}\renewcommand{\previouslabel}{}}
\newcommand{\JumpBackOff}{\setboolean{JumpBackOn}{false}}
\newcommand{\jumpdown}[1]{\marginnote{\RaggedRight\tiny{\hyperref[#1]{down to #1}}}} % jump down to answers
\newcommand{\jumpback}[1]{%
\renewcommand{\previouslabel}{\recentlabel} % Save current label as previous
\renewcommand{\recentlabel}{#1} % Update last label
\marginnote{\RaggedRight\tiny{\hyperref[#1]{up to #1}}}} % jump back to question
\usepackage{hyperref}
\begin{document}
\chapter{Working example}
\section{Questions}\JumpBackOff
\begin{itemize}
\item Question\label{sec:Q:1}\jumpdown{sec:A:1} 1:
\blindtext
\item Question\label{sec:Q:2}\jumpdown{sec:A:2} 2:
\blindtext
\item Question\label{sec:Q:3}\jumpdown{sec:A:3} 3:
\blindtext
\end{itemize}
\clearpage
\section{Answers}\JumpBackOn
\subsection{Answer 1}\label{sec:A:1}\jumpback{sec:Q:1}
\blindtext
\blindtext
\blindtext
\subsection{Answer 2}\label{sec:A:2}\jumpback{sec:Q:2}
\blindtext
\blindtext
\blindtext
\blindtext
\vfill
\subsection{Answer 3}\label{sec:A:3}\jumpback{sec:Q:3}
\blindtext
\blindtext
\end{document}