控制标题中标签的引用(hyperref、komascript)

控制标题中标签的引用(hyperref、komascript)

我正在为学生完成一本相当长的书(约 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}

相关内容