Randnotizen und Multicol (zweispaltig)

Fragen zum richtigen Zitieren oder zum richtigen Format, dann gehört es hier rein.


Gast

Gesamtzahl der Fragen am Dokumentenanfang ausgeben?

Beitrag von Gast »

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?
\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}

Gast

Beitrag von Gast »

mycounter? Gibt es in dem ganzen Beispiel nicht. Wenn du dagegen mynumber mit \refstepcounter erhöhst, kannst du am Ende ein \label setzen und dann mit \ref auf dieses verweisen.

Gast

Beitrag von Gast »

Danke
Ja, sorry ich meinte mynumber. So wird er aktuell bei jeder Frage erhöht.
\addtocounter{mynumber}{1}
Wie kann man auf einen Zähler ein Label setzen?
Ich habe bisher das Label nur für Texstellen oder Grafiken etc. verwendet.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

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, ....
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.

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.

Auch ein

Beitrag von Auch ein »

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.

Gast

Beitrag von Gast »

Danke für den Hinweis. Ich werde versuchen das zu ändern.
Kannst Du mir vielleicht noch auf die Sprünge helfen wie das mit dem Zähler/Labelfunktioniert?

Gast

Beitrag von Gast »

Falls noch Jemand vor so einem Problem steht. Ich habe es jetzt so gelöst:
\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}
Die Erklärung von Heiko ist mir leider zu hoch. Wie kann ich denn das Makro unter einen anderen Namen kopieren...?

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Auch ein hat geschrieben:Wenn Du es genau wissen willst, ist hier die Antwort von Heiko:
Das ist ja im Wesentlichen was ich auch sagte: man braucht die pagevalue-Property.

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

Antworten