\documentclass{scrbook} \usepackage{multicol} \usepackage[savepos,pagelayout,abspage]{zref} \usepackage{zref-abspos} \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} \section{Insgesamt sind es \textbf{\arabic{mynumber}} Fragen.} \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 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}
Randnotizen und Multicol (zweispaltig)
Gesamtzahl der Fragen am Dokumentenanfang ausgeben?
Ich würde gerne auf dem Titelblatt oder der nächsten Seite gerne die Anzahl der Fragen im Gesamten Dokument ausgeben. Wie kann man nach der letzten Frage den Zählerstand "mycounter" speichern und dann (im nächsten Lauf?) am Dokumentenanfang ausgeben?
Ich denke deine Analyse ist falsch. Da ist zwar ein Fehler, aber der Patch ist nicht korrekt. Das abspos-Modul bestimmt Längen relativ zum Seitenspiegel und der hängt von der "gedruckten" Seitenzahl und nicht von der absoluten Seitenzahl ab. In den meisten Fällen dürfte der Unterschied keine Bedeutung haben, weil normalerweise sowohl die Seitenzahl als auch die absoluten Zahl gleichzeitig ungerade sind, aber wenn sie auseinanderdriften, sollte pagevalue benutzt werden.Auch ein hat geschrieben: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, ....
Der Fehler in zref-abspos ist, dass pagevalue nicht in der Property-Liste ist und dass zref den Wert nicht verwenden kann und daher auf \number\c@page ausweicht, und das ist wirklich vom asynchronen Modus abhängig.
Die richtige Korrektur ist es daher, \zref@addprop{savepos}{pagevalue} hinzuzufügen.
Ulrike Fischer
www.troubleshooting-tex.de
www.troubleshooting-tex.de
Wenn Du es genau wissen willst, ist hier die Antwort von Heiko:
Heiko hat geschrieben:\ZREF@abspos@...` erwartet
ein Label vom Modul `thepage` mit `pagelayout`. Dort gibt es
die Property `pagevalue`. Im Code wird das jedoch auf
ein Label von `\zsavepos` angewendet, das lediglich die
x-, y-Position, sowie `abspage` enthält.
Der richtige Weg ist ein wenig komplizierter:
1. Aus dem `\zlabel` (`a:<Nummer>`) wird die absolute
Seitenzahl extrahiert.
2. Mit der absoluten Seitenzahl kommt man an das automatisch
generierte `thepage`-Label `thepage<absolute Seitenzahl>`,
das man dann den Makros `\ZREF@abspos@...` vorwerfen kann.
Weitere Bemerkungen:
* Die Frage, wann eine Seite ungerade ist, habe ich hier
mit `pagevalue` entschieden. Problematisch sind die
Fälle, bei denen gerade und ungerade Seiten bei der
absoluten und normalen Seitennummer verschieden sind,
etwa weil jemand eine Titelseite "0" eingefügt hat.
Dann trifft `pagevalue` eher die Benutzererwartungen.
* Macros mit Prefix `\ZREF@` leiten interne Makros ein,
die ohne Warnung bei Updates (zur Zeit leider nicht
wahrscheinlich) geändert werden können.
In diesem Fall, hatte ich was angefangen, aber
leider nicht zu Ende gebracht (zu Ende gedacht,
sauber getestet, dokumentiert.)
Meine Empfehlung wäre daher für den Benutzer,
von dem das Beispiel ursprünglich stammte,
das benötigte Makro unter anderem Namen zu
kopieren, um eine bessere Stabilität für
die ferne Zukunft zu haben.
Falls noch Jemand vor so einem Problem steht. Ich habe es jetzt so gelöst:
Die Erklärung von Heiko ist mir leider zu hoch. Wie kann ich denn das Makro unter einen anderen Namen kopieren...?
\documentclass{scrbook} \usepackage{multicol} \usepackage[savepos,pagelayout,abspage]{zref} \usepackage{zref-abspos} \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} \renewcommand*\themynumber{\arabic{mynumber}} \addtokomafont{minisec}{\small}% Schriftgröße für \minisec ändern \newcommand{\Frage}[1] {% %\addtocounter{mynumber}{1}% \refstepcounter{mynumber}\label{testmn} \minisec{Frage:\Randnotiz{\arabic{mynumber}}} \vskip-\parskip% Übler Hack, der sich auf Interna der Klasse stützt! #1\par } \usepackage{blindtext} \begin{document} \section{Insgesamt sind es \textbf{\ref{testmn}} Fragen.} \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 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}
Das ist ja im Wesentlichen was ich auch sagte: man braucht die pagevalue-Property.Auch ein hat geschrieben:Wenn Du es genau wissen willst, ist hier die Antwort von Heiko:
Ich habe mal bei github einen Eintrag in den Issuetracker gemacht. Evtl. kannst du da auch einen Kommentar einfügen. Dann kann die "Oberdiek Package Support Group" den Teil des Pakets evtl mal verbessern.
https://github.com/ho-tex/oberdiek/issues/24
Ulrike Fischer
www.troubleshooting-tex.de
www.troubleshooting-tex.de