当页面完成时存储宏的值

当页面完成时存储宏的值

在我之前的问题没有得到解答之后,我将 MWE 修剪到我认为真正的问题所在。我有一个\recent存储信息的宏(-links 需要这些信息)。当发出hyperref某个命令()时,此宏会定期更新(即覆盖) 。\newone

我想将此宏的值(即\recent)存储在页面末尾或另一个宏(\previous)的新页面开头以供引用(我需要它hyperref在每个页面上放置一个 -backlink)。我干预了常见的问题(everypage,,evershi;似乎不喜欢) atbegshi,但不知何故-macro 更新得太快或在错误的时间。bophookhyperref\previous

请考虑此 MWE 来说明问题。我在使用正常宏的“ ”newtoks之后切换到“ ” renewcommand{\previous}{\recent},但没有成功,但这并没有起到什么帮助作用。

这个想法是让标题中出现真正的“ \previous”。然而,正如 MWE 所示,情况并非如此。可能有一个非常简单的解决方案,可能与发货机制有关,但我太盲目(和缺乏经验)而看不到它。

非常感谢您的帮助。

[上一个问题在这里:https://tex.stackexchange.com/questions/539473/control-the-referencing-of-labels-in-headlines-hyperref-komascript-or-how-a]

\documentclass[%
12pt,% 
twoside=false,%
cleardoublepage=empty,%
open=right,% 
parskip=half*,% 
headings=normal,% 
numbers=noenddot,% 
chapterprefix=true,% 
%draft % 
]{scrbook}

\usepackage[headsepline]{scrlayer-scrpage} \pagestyle{scrheadings}
\clearscrheadfoot 

\newcommand{\JumpBackHeadline}{\pagemark -- \the\previous}

\ohead{\JumpBackHeadline}
  
\usepackage{everypage}
\usepackage{blindtext}

\newtoks{\recent}
\newtoks{\previous}
\global\recent={dummyrecent}
\global\previous={dummyprevious}


\AddEverypageHook{%
  previous before EverypageHookoperation: \the\previous\\%
  \global\previous={\the\recent}%
  previous after EverypageHookoperation: \the\previous
}

\newcommand{\newone}[1]{%
  my argument is: #1\\
  previous is: \the\previous\\
  recent was:  \the\recent\\
  \global\recent={#1}
  recent is: \the\recent
}


\begin{document}
Starting:\\
previous is: \the\previous\\
recent is:  \the\recent

\newone{number1}

\blindtext[5]

\newone{number2}

And now lots of text:\\

\blindtext[10]

\newone{number3}
\end{document}

编辑:抱歉造成混淆。希望以下 MWE 能更好地展示我想要的内容。我关心的不是页码,而是链接标签。我试图解释 MWE 中“问题 1 的答案”中的概念。整个方法可能很乱;如果有人有更好的想法,请随时发表评论。

\documentclass[
  12pt,
  twoside=false,
  cleardoublepage=empty,
  open=right,
  parskip=half*,
  headings=normal,
  numbers=noenddot,
  chapterprefix=true,
  %draft,
]{scrartcl}

\usepackage{everypage}
\usepackage{blindtext}
\usepackage{marginnote}
\usepackage{ifthen,ragged2e}
\usepackage{hyperref}
%%% The Headline %%%%
\usepackage[headsepline]{scrlayer-scrpage} \pagestyle{scrheadings}
\clearscrheadfoot

\newcommand{\JumpBackHeadline}{% define the headline, depening on JumpBackOn
  \ifthenelse{\boolean{JumpBackOn}}%
  {\pagemark -- Quick link to
    \hyperref[\previous]{\previous}}% Hyperlink only, if jumpback is on
  {\pagemark}% %otherwise, i.e. in the questions section, just the
             % pagemark
}

\ohead{\JumpBackHeadline}

%% The jump commands to set the hyperlinks

\newboolean{JumpBackOn}  % Switch on for jumpback hyperlinks
\setboolean{JumpBackOn}{false} % but not in the first (questions) section


\newcommand{\jumpdown}[1]{\marginnote{\RaggedRight\tiny{\hyperref[#1]{Down
        to
        #1}}}} % Hyperlink to jump from the question in the questions
               % section to the label at the start of the answer in
               % the answer section; #1 is this label

\newcommand{\jumpback}[1]{% Jump from the answer to the label at the start of the corresponding question in the questions section; #1 is this label.
  \gdef\recent{#1}% Remember this label, it is the label to the question that is currently being discussed.
  \marginnote{\RaggedRight\tiny{\hyperref[#1]{Up to
        #1}}} % place the hyperlink in the margin
}


%%%% When a page is finished and shipped out: remember the label in
%%%% \recent *at this time* by storing it in \previous

\AddEverypageHook{%
  % globally make \previous the same as the current \recent
  \global\let\previous=\recent
}

\begin{document}

\section{Questions for students (sometimes very
  long)}\setboolean{JumpBackOn}{false}
   
\begin{enumerate}
\item[1.] Question 1 \label{q:1}\jumpdown{a:1}

  \blindtext

\item[2.] Question 2 \label{q:2}\jumpdown{a:2}

  \blindtext

\item[3.] Question 3 \label{q:3}\jumpdown{a:3}

  \blindtext

\item[4.] Question 4 \label{q:4}\jumpdown{a:4}

  \blindtext
  
\end{enumerate}

\clearpage

\section{Answers, sometimes very
  long}\setboolean{JumpBackOn}{true} % From now on, jumpback link in headline


\subsection{Answer to question 1}\label{a:1}\jumpback{q:1}

This is the answer text to question 1. In the margin, a label links
back to question 1; this link is correct. However, as this answer text
extends over a few pages, students should have a quick link in the
headline of each page to jump back to question 1 until answer 1 is
finished. The link should be at the same position in the top or maybe
bottom region of every page; it does not have to be the header, if
this causes trouble.

The link in the headline (or somewhere else) should point to the label
of the question that is (still) discussed \emph{at the beginning of
  each page}. In our case, that is question 1 for page 3, 4 and 5.
However, on page 5 there is a link to question 2, not 1. Similarly, on
page 6 there is a link to question 3, not 2, although this question
starts at the top of the next page.

Again, at page 7, the link points to question 4, even though this
question starts at the top of the next page. The link on page 8 is
also wrong, although it appears right: If the previous-linklabel is
fixed at the end of page 7 and this label would then (correctly) point
to question 3, it should point to question 3 at the top of page 8 as
well, although this is not what I want: It is a design failure on my
part, but I have no better idea at the moment. If anyone knows how to
approach the whole thing in a better way, I would be grateful.



\blindtext[9]

\subsection{Answer to question 2}\label{a:2}\jumpback{q:2}

\blindtext[7]


\subsection{Answer to question 3}\label{a:3}\jumpback{q:3}



\blindtext[4]

Some space to fill the page:


\vfill
\subsection{Answer to question 4}\label{a:4}\jumpback{q:4}

\blindtext


\end{document}

答案1

\global\previous={\the\recent}将要不是传递当前内容\recent。你应该这样做

\global\previous=\expandafter{\the\recent}

但我认为使用\global\let更好。

\documentclass[
  12pt,
  twoside=false,
  cleardoublepage=empty,
  open=right,
  parskip=half*,
  headings=normal,
  numbers=noenddot,
  chapterprefix=true,
  %draft,
]{scrbook}

\usepackage[headsepline]{scrlayer-scrpage} \pagestyle{scrheadings}
\clearscrheadfoot 

\newcommand{\JumpBackHeadline}{\pagemark -- \previous}

\ohead{\JumpBackHeadline}

\usepackage{everypage}
\usepackage{blindtext}

\def\recent{dummyrecent}
\def\previous{dummyprevious}


\AddEverypageHook{%
  previous before EverypageHookoperation: \previous\\%
  % globally make \previous the same as the current \recent
  \global\let\previous=\recent
  previous after EverypageHookoperation: \previous
}

\newcommand{\newone}[1]{%
  my argument is: #1\\
  previous is: \previous\\
  recent was:  \recent\\
  \gdef\recent{#1}%
  recent is: \recent
}


\begin{document}
Starting:\\
previous is: \previous\\
recent is:  \recent

\newone{number1}

\blindtext[5]

\newone{number2}

And now lots of text:

\blindtext[10]

\newone{number3}
\end{document}

相关内容