
Depois que minha pergunta anterior não foi respondida, reduzi o MWE para o que considero ser o problema real. Eu tenho uma macro \recent
que armazena informações (necessárias para hyperref
links). Esta macro é atualizada regularmente (ou seja, sobrescrita) quando um determinado comando ( \newone
) é emitido.
Quero armazenar o valor desta macro (ou seja \recent
) no final de uma página ou no início de uma nova página em outra macro ( \previous
) para fins de referência (preciso colocar um hyperref
-backlink em cada página). Eu me intrometi nos suspeitos do costume ( everypage
, evershi
, atbegshi
; bophook
não parece gostar hyperref
), mas de alguma forma a \previous
-macro é atualizada em breve ou na hora errada.
Por favor, considere este MWE para uma ilustração do problema. Mudei para " newtoks
" depois de " renewcommand{\previous}{\recent}
" com macros normais não ter conseguido, mas isso não ajudou em nada.
A ideia é ter o verdadeiro " \previous
" no título. Contudo, como mostra o MWE, este não é o caso. Provavelmente, existe uma solução extremamente simples para isso, e provavelmente tem a ver com mecanismos de envio, mas sou cego demais (e inexperiente) para ver isso.
Toda ajuda é apreciada.
[pergunta anterior aqui: https://tex.stackexchange.com/questions/539473/control-the-reference-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}
Editar: Desculpe por causar confusão. Espero que o MWE a seguir mostre melhor o que desejo. Minha preocupação não são os números das páginas, mas os rótulos dos links. Estou tentando explicar o conceito na "resposta à pergunta 1" do MWE. Provavelmente toda a abordagem é uma bagunça; se alguém tiver uma ideia melhor, não hesite em comentar.
\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}
Responder1
\global\previous={\the\recent}
vainãoentregar o conteúdo atual de \recent
. Você deveria fazer
\global\previous=\expandafter{\the\recent}
Mas acho que usar \global\let
é melhor.
\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}