
После того, как мой предыдущий вопрос остался без ответа, я обрезал MWE до того, что, по моему мнению, является настоящей проблемой. У меня есть макрос, \recent
который хранит информацию (необходимую для -links). Этот макрос регулярно обновляется (т.е. перезаписывается) при выполнении hyperref
определенной команды ( ).\newone
Я хочу сохранить значение этого макроса (т. е. \recent
) в конце страницы или в начале новой страницы в другом макросе ( \previous
) для ссылок (мне нужно, чтобы он ставил hyperref
-обратную ссылку на каждую страницу). Я вмешивался в обычные подозреваемые ( everypage
, evershi
, atbegshi
; bophook
похоже, не нравится hyperref
), но каким-то образом \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 лучше показывает, что я хочу. Меня беспокоят не номера страниц, а метки ссылок. Я пытаюсь объяснить концепцию в «ответе на вопрос 1» в MWE. Вероятно, весь подход — беспорядок; если у кого-то есть идея получше, пожалуйста, не стесняйтесь комментировать.
\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}