Randnotizen und Multicol (zweispaltig)

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Randnotizen und Multicol (zweispaltig)

von u_fischer » Sa 25. Mär 2017, 23:17

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

von Gast » Sa 25. Mär 2017, 15:34

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

von Gast » Sa 25. Mär 2017, 14:47

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?

von Auch ein » Sa 25. Mär 2017, 14:44

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.

von u_fischer » Sa 25. Mär 2017, 14:17

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.

von Gast » Sa 25. Mär 2017, 13:27

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.

von Gast » Sa 25. Mär 2017, 13:05

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.

Gesamtzahl der Fragen am Dokumentenanfang ausgeben?

von Gast » Sa 25. Mär 2017, 11:35

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}

Schöne Weihnachten und Nachfrage

von IRM » Mo 26. Dez 2016, 03:08

Ich wünsche allen noch schöne Weihnachten!

Dank Eurer Hilfe funktioniert es nun.
Wie kann ich den Text in den Randspalten etwas näher an meinen Text bringen? Geht das?

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.

Nach oben