von Auch ein » Fr 11. Nov 2016, 10:02
Nachdem das (fälschlich? ich bin nicht Heiko) auch mich per Mail erreicht hat, bin auch ich zu dem Schluss gekommen, dass in zref-abspos.sty ein potentieller Bug enthalten ist. Sowohl in \ZREF@abspos@head@x@left als auch in \ZREF@abspos@marginpar@x@left wird die aktuelle Seite via pagevalue bestimmt. Aufgrund der asynchronen Ausgabe von LaTeX ist allerdings der Wert davon nicht immer die Seitenzahl, auf der das Material bei der Ausgabe landet, sondern die Seitenzahl, auf der das Material gesammelt wird. Im Beispiel ist das für die Marke a:8 noch 2, obwohl die Ausgabe dann auf Seite 3 erfolgt.
Interessanter Weise hat zref mit dem Modul abspage eigentlich das Werkzeug, um dieses Problem zu vermeiden. Man müsste schlicht an den beiden Stellen pagevalue durch abspage ersetzen. Ich vermute, dass das eigentlich auch so geplant war. Die Vermutung kommt daher, dass zref-abspos eine Abhängigkeit von zref-abspage definiert hat, die derzeit real aber gar nicht vorhanden ist.
Langer Rede kurzer Sinn: Aktuelle funktionieren \ZREF@abspos@body@x@left, \ZREF@abspos@body@x@center und ZREF@abspos@body@x@right in allen obigen Beispielen nicht, wie erhofft. Um das zu ändern, muss man patchen:
\documentclass{scrbook}
\usepackage{multicol}
\usepackage[savepos,pagelayout,abspage]{zref}
\usepackage{zref-abspos}% Warum kann man das eigentlich nicht per zref-Option
% laden?
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\ZREF@abspos@head@x@left}{pagevalue}{abspage}{}{}
\xpatchcmd{\ZREF@abspos@body@x@left}{pagevalue}{abspage}{}{}
\xpatchcmd{\ZREF@abspos@marginpar@x@left}{pagevalue}{abspage}{}{}
\makeatother
\newcounter{mparnum}
\renewcommand*{\themparnum}{a:\arabic{mparnum}}
\makeatletter
\def\putmarginpar#1{%
\stepcounter{mparnum}%
\zsavepos{\themparnum}%
\settowidth{\@tempdima}{#1}%
\ifnum \numexpr\ZREF@abspos@body@x@center{\themparnum}\relax>\number\zposx{\themparnum}%
\hbox to 0pt{\hskip\numexpr-\zposx{\themparnum} + \ZREF@abspos@body@x@left{\themparnum} - \zref@extract{\themparnum}{marginparsep} -\@tempdima \relax sp#1}%
\else
\hbox to 0pt{\hskip\numexpr-\zposx{\themparnum} + \ZREF@abspos@body@x@right{\themparnum} + \zref@extract{\themparnum}{marginparsep} \relax sp #1}%
\fi%
}
\makeatother
\newcommand{\Randnotiz}[1]{\putmarginpar{#1}}
\newcounter{mynumber}
\setcounter{mynumber}{0}
\addtokomafont{minisec}{\small}% Schriftgröße für \minisec ändern
\newcommand{\Frage}[1]
{%
\addtocounter{mynumber}{1}%
\minisec{Frage:\Randnotiz{\arabic{mynumber}}}
\vskip-\parskip% Übler Hack, der sich auf Interna der Klasse stützt!
#1\par
}
\usepackage{blindtext}
\begin{document}
\begin{multicols}{2}% Warum eigentlich nicht gleich Klassenoption twocolumn?
\Frage{First} of something that is very long and if it need be can be
set somewhere
\Frage{Second}, where it can be subsequently found or lost
\Frage{Third.}
\blindtext
\blindtext
\blindtext
\blindtext
Irgendein Text zum testen das ist ein alternativer Text
Irgendein Text zum testen das ist ein alternativer Text
Irgendein Text zum testen das ist ein alternativer Text
\Frage{vier}
\blindtext
\Frage{Fünf}
\blindtext
\Frage{sechs}
\blindtext
\Frage{sieben}
\blindtext
\Frage{acht}
\blindtext
\end{multicols}
\end{document}
Sollte irgendwann Heiko zu demselben Schluss kommen, dann werden die drei obigen Patches schlicht wirkungslos. Das Beispiel sollte weiterhin funktionieren.
PS: Den Patch braucht man auch, wenn man auf die Methode mit \ifthispageodd zurückgreift, weil sonst das Ergebnis von \ZREF@abspos@body@x@center unzuverlässig ist.
Nachdem das (fälschlich? ich bin nicht Heiko) auch mich per Mail erreicht hat, bin auch ich zu dem Schluss gekommen, dass in [tt]zref-abspos.sty[/tt] ein potentieller Bug enthalten ist. Sowohl in [tt]\ZREF@abspos@head@x@left[/tt] als auch in [tt]\ZREF@abspos@marginpar@x@left[/tt] wird die aktuelle Seite via [tt]pagevalue[/tt] bestimmt. Aufgrund der asynchronen Ausgabe von LaTeX ist allerdings der Wert davon nicht immer die Seitenzahl, auf der das Material bei der Ausgabe landet, sondern die Seitenzahl, auf der das Material gesammelt wird. Im Beispiel ist das für die Marke [tt]a:8[/tt] noch 2, obwohl die Ausgabe dann auf Seite 3 erfolgt.
Interessanter Weise hat [tt]zref[/tt] mit dem Modul [tt]abspage[/tt] eigentlich das Werkzeug, um dieses Problem zu vermeiden. Man müsste schlicht an den beiden Stellen [tt]pagevalue[/tt] durch [tt]abspage[/tt] ersetzen. Ich vermute, dass das eigentlich auch so geplant war. Die Vermutung kommt daher, dass [tt]zref-abspos[/tt] eine Abhängigkeit von [tt]zref-abspage[/tt] definiert hat, die derzeit real aber gar nicht vorhanden ist.
Langer Rede kurzer Sinn: Aktuelle funktionieren [tt]\ZREF@abspos@body@x@left[/tt], [tt]\ZREF@abspos@body@x@center[/tt] und [tt]ZREF@abspos@body@x@right[/tt] in allen obigen Beispielen nicht, wie erhofft. Um das zu ändern, muss man patchen: [code]\documentclass{scrbook}
\usepackage{multicol}
\usepackage[savepos,pagelayout,abspage]{zref}
\usepackage{zref-abspos}% Warum kann man das eigentlich nicht per zref-Option
% laden?
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\ZREF@abspos@head@x@left}{pagevalue}{abspage}{}{}
\xpatchcmd{\ZREF@abspos@body@x@left}{pagevalue}{abspage}{}{}
\xpatchcmd{\ZREF@abspos@marginpar@x@left}{pagevalue}{abspage}{}{}
\makeatother
\newcounter{mparnum}
\renewcommand*{\themparnum}{a:\arabic{mparnum}}
\makeatletter
\def\putmarginpar#1{%
\stepcounter{mparnum}%
\zsavepos{\themparnum}%
\settowidth{\@tempdima}{#1}%
\ifnum \numexpr\ZREF@abspos@body@x@center{\themparnum}\relax>\number\zposx{\themparnum}%
\hbox to 0pt{\hskip\numexpr-\zposx{\themparnum} + \ZREF@abspos@body@x@left{\themparnum} - \zref@extract{\themparnum}{marginparsep} -\@tempdima \relax sp#1}%
\else
\hbox to 0pt{\hskip\numexpr-\zposx{\themparnum} + \ZREF@abspos@body@x@right{\themparnum} + \zref@extract{\themparnum}{marginparsep} \relax sp #1}%
\fi%
}
\makeatother
\newcommand{\Randnotiz}[1]{\putmarginpar{#1}}
\newcounter{mynumber}
\setcounter{mynumber}{0}
\addtokomafont{minisec}{\small}% Schriftgröße für \minisec ändern
\newcommand{\Frage}[1]
{%
\addtocounter{mynumber}{1}%
\minisec{Frage:\Randnotiz{\arabic{mynumber}}}
\vskip-\parskip% Übler Hack, der sich auf Interna der Klasse stützt!
#1\par
}
\usepackage{blindtext}
\begin{document}
\begin{multicols}{2}% Warum eigentlich nicht gleich Klassenoption twocolumn?
\Frage{First} of something that is very long and if it need be can be
set somewhere
\Frage{Second}, where it can be subsequently found or lost
\Frage{Third.}
\blindtext
\blindtext
\blindtext
\blindtext
Irgendein Text zum testen das ist ein alternativer Text
Irgendein Text zum testen das ist ein alternativer Text
Irgendein Text zum testen das ist ein alternativer Text
\Frage{vier}
\blindtext
\Frage{Fünf}
\blindtext
\Frage{sechs}
\blindtext
\Frage{sieben}
\blindtext
\Frage{acht}
\blindtext
\end{multicols}
\end{document}[/code]
Sollte irgendwann Heiko zu demselben Schluss kommen, dann werden die drei obigen Patches schlicht wirkungslos. Das Beispiel sollte weiterhin funktionieren.
PS: Den Patch braucht man auch, wenn man auf die Methode mit [tt]\ifthispageodd[/tt] zurückgreift, weil sonst das Ergebnis von [tt]\ZREF@abspos@body@x@center[/tt] unzuverlässig ist.