Randnotizen und Multicol (zweispaltig)

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


IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Randnotizen und Multicol (zweispaltig)

Beitrag von IRM »

Guten Morgen :-)

Ich möchte gerne mein Buch (600 Seiten) zweispaltig erstellen und verwende aber viele kurze Randnotizen (Zahlen und Zeichen wie zb. ++).
Leider ist ja \marginline nicht möglich bei multicol. Ich muss da also einiges ändern. Im Internet habe ich eine Bastellösung gefunden. Gibt es hier eine Möglichkeit den Befehl so aufzurufen, dass die Variable a automatisch eins hochgezählt wird? Also am Ende wäre ein Befehl \Randspalte{Text} sehr schön. Die Variante mit {a:Zahl}{Text} ist sehr unhandlich, da in langen Dokumenten sich immer wieder Dinge verschieben und dann die Zahlen auch nicht mehr chronologisch wären. Schonmal vielen Dank!!
\documentclass{article}
\usepackage{multicol,zref-savepos}
\usepackage{blindtext}
\def\putmarginpar#1#2{%
  \zsavepos{#1}%
  \ifnum20432158>\number\zposx{#1}%
     \hbox to 0pt{\hskip\dimexpr-\zposx{#1}sp +0.5cm \relax#2}%
  \else
      \hbox to 0pt{\hskip4cm #2}%
  \fi%
}
\parskip0pt
\begin{document}
\begin{multicols}{2}

Testing \putmarginpar{a:1}{First} of something that is very long and if  it need be can be set somewhere 
\putmarginpar{a:2}{Second}, where it can be subsequently found or lost\blindtext 
\putmarginpar{a:3}{Third.}
\blindtext
\putmarginpar{a:4}{vier}
\blindtext

%\zsavepos{dd}\zposx{dd}
\end{multicols}

Gast

Beitrag von Gast »

Klar. Man braucht dafür nun einen Zähler:
\documentclass{article}
\usepackage{multicol,zref-savepos}
\usepackage{blindtext}
\newcounter{mparnum}
\renewcommand*{\themparnum}{a:\arabic{mparnum}}
\def\putmarginpar#1#2{%
  \stepcounter{mparnum}%
  \zsavepos{\themparnum}%
  \ifnum20432158>\number\zposx{\themparnum}%
     \hbox to 0pt{\hskip\dimexpr-\zposx{\themparnum}sp +0.5cm \relax#2}%
  \else
      \hbox to 0pt{\hskip4cm #2}%
  \fi%
}
\begin{document}
\begin{multicols}{2}

Testing \putmarginpar{a:1}{First} of something that is very long and if  it need be can be set somewhere 
\putmarginpar{a:2}{Second}, where it can be subsequently found or lost\blindtext 
\putmarginpar{a:3}{Third.}
\blindtext
\putmarginpar{a:4}{vier}
\blindtext
\end{multicols}

Gast

Beitrag von Gast »

Danke für Deine Hilfe!
Du hast aber unten bei den Aufrufen nichts geändert.. Wie schreibe ich nun Text in die Randspalte? \putmarginpar{Text} geht bei mir nicht.
P.S: In dem Beispiel fehlte die letzte Zeile daher war es nicht lauffähig. Sorry.
\documentclass{article}
\usepackage{multicol,zref-savepos}
\usepackage{blindtext}
\newcounter{mparnum}
\renewcommand*{\themparnum}{a:\arabic{mparnum}}
\def\putmarginpar#1#2{%
  \stepcounter{mparnum}%
  \zsavepos{\themparnum}%
  \ifnum20432158>\number\zposx{\themparnum}%
     \hbox to 0pt{\hskip\dimexpr-\zposx{\themparnum}sp +0.5cm \relax#2}%
  \else
      \hbox to 0pt{\hskip4cm #2}%
  \fi%
}
\begin{document}
\begin{multicols}{2}

Testing \putmarginpar{a:1}{First} of something that is very long and if  it need be can be set somewhere
\putmarginpar{a:2}{Second}, where it can be subsequently found or lost\blindtext
\putmarginpar{a:3}{Third.}
\blindtext
\putmarginpar{a:4}{vier}
\blindtext
\end{multicols}
\end{document}

Gast

Beitrag von Gast »

So scheint es zu gehen! Vielen Dank!
\documentclass{article}
\usepackage{multicol,zref-savepos}
\usepackage{blindtext}
\newcounter{mparnum}
\renewcommand*{\themparnum}{a:\arabic{mparnum}}
\def\putmarginpar#1{%
  \stepcounter{mparnum}%
  \zsavepos{\themparnum}%
  \ifnum20432158>\number\zposx{\themparnum}%
     \hbox to 0pt{\hskip\dimexpr-\zposx{\themparnum}sp +0.5cm \relax#1}%
  \else
      \hbox to 0pt{\hskip4cm #1}%
  \fi%
}
\begin{document}
\begin{multicols}{2}

Testing \putmarginpar{First} of something that is very long and if  it need be can be set somewhere
\putmarginpar{Second}, where it can be subsequently found or lost\blindtext
\putmarginpar{Third.}
\blindtext
\putmarginpar{vier}
\blindtext

\end{multicols}
\end{document}

IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Beitrag von IRM »

Leider geht es doch nicht in meinem Dokument. Ich verwende die Komascript-Klasse "scrbook". Gibt es eine Möglichkeit das Beispiel dafür anzupassen?
\documentclass{scrbook}
\usepackage{multicol,zref-savepos}
\usepackage{blindtext}
\newcounter{mparnum}
\renewcommand*{\themparnum}{a:\arabic{mparnum}}
\def\putmarginpar#1{%
  \stepcounter{mparnum}%
  \zsavepos{\themparnum}%
  \ifnum20432158>\number\zposx{\themparnum}%
     \hbox to 0pt{\hskip\dimexpr-\zposx{\themparnum}sp +0.5cm \relax#1}%
  \else
      \hbox to 0pt{\hskip4cm #1}%
  \fi%
}
\begin{document}
\begin{multicols}{2}

Testing \putmarginpar{First} of something that is very long and if  it need be can be set somewhere
\putmarginpar{Second}, where it can be subsequently found or lost\blindtext
\putmarginpar{Third.}
\blindtext
\putmarginpar{vier}
\blindtext

\end{multicols}
\end{document}

Gast

Beitrag von Gast »

Du hast ein doppelseitiges Dokument mit ganz anderen Randeinstellungen. Logischerweise kannst du dabei nicht mehr mit statischen Werten sowohl für die Ermittlung der Entscheidungsposition zwischen den Spalten als auch für die Verschiebung in den Rand arbeiten. Hier einmal ein Beispiel, bei dem die Positionen ebenfalls mit Hilfe von zref berechnet werden. Da es aber in zref AFAIK kein Makro für die Breite des linken bzw. rechten Randes gibt, habe ich für den Text im linken Rand jeweils die Breite des zu platzierenden Textes verwendet. Damit ist der Text links rechtsbündig platziert:
\documentclass{scrbook}
\usepackage{multicol,zref-savepos,zref-abspos}
\usepackage{blindtext}
\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
\begin{document}
\begin{multicols}{2}
Testing \putmarginpar{First} of something that is very long and if  it need be can be set somewhere
\putmarginpar{Second}, where it can be subsequently found or lost\blindtext
\putmarginpar{Third.}
\blindtext
\putmarginpar{vier oder so}
\blindtext
\end{multicols}
\clearpage
\begin{multicols}{2}
Testing \putmarginpar{First} of something that is very long and if  it need be can be set somewhere
\putmarginpar{Second}, where it can be subsequently found or lost\blindtext
\putmarginpar{Third.}
\blindtext
\putmarginpar{vier oder so}
\blindtext
\end{multicols}
\end{document}
Wie man an dem Beispiel auch sieht, wird es kritisch, wenn der innere Rand schmal ist. Dann passt einfach kein längerer Text und ragt damit in den Rand.

Bei einem doppelseitigen Dokument sind Randnotizen am inneren Rand eigentlich nur sinnvoll, wenn man mit sehr, sehr breiten Rändern bzw. asymmetrischem Rändern arbeitet. Für ein normales Dokument sollte man das vermeiden, bzw. auch für die innere Spalte die Randnotizen in den äußeren Rand setzen. Am inneren Rand kann man allenfalls eine kleine Markierung unterbringen.

IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Beitrag von IRM »

Nochmals Vielen Dank!
Leider tritt nochmal ein Fehler auf. Auf einer neuen Seite wird die Randnotiz manchmal zu weit außen oder innen (über dem Text) plaziert.
Ich habe versucht ein Minimalbeispiel zu erstellen bei dem der Fehler auftritt. Scheinbar klappt hier die Berechnung nicht. Wie läßt sich das lösen?
\documentclass{scrbook}
\usepackage{multicol, zref-savepos,zref-abspos,blindtext}
\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}

\newcommand{\Frage}[1]
{%
	\addtocounter{mynumber}{1}%
	\minisec{\small{Frage:}\Randnotiz{\arabic{mynumber}}}
\vskip-\parskip%
#1\par
}

\begin{document}
	\begin{multicols}{2}
		\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}

Gast

Beitrag von Gast »

Offenbar versagt da zref unmittelbar beim Seitenumbruch bei der Ermittlung der Randposition. Warum das so ist, musst du schon den Autor des Pakets fragen.

Du kannst versuchen, stattdessen mit \ifthispageodd (KOMA-Script), \marginnote (gleichnamiges Paket) und \reversemarginpar zu arbeiten:
\documentclass{scrbook}
\usepackage{multicol}
\usepackage{zref-savepos,zref-abspos,blindtext}
\usepackage{marginnote}
\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}%
   \ifthispageodd{\reversemarginpar}{}%
   \marginnote{#1}%
\else
   \ifthispageodd{}{\reversemarginpar}%
   \marginnote{#1}%
   \fi%
}
\makeatother

\newcommand{\Randnotiz}[1]{\putmarginpar{#1}}

\newcounter{mynumber}
\setcounter{mynumber}{0}% Kannst du dir sparen, macht \newcounter

\newcommand{\Frage}[1]
{%
   \addtocounter{mynumber}{1}%
   \minisec{\small{Frage:}% \small kennt kein Argument, Schriftgröße besser allgemein oder in einer Gruppe per \setkomafont{minisec}{…} setzen!
    \Randnotiz{\arabic{mynumber}}}
\vskip-\parskip%
#1\par
}

\begin{document}
   \begin{multicols}{2}
      \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}
Bitte beachte auch die Kommentare im Code.

Ob dabei allerdings \ZREF@abspos@body@x@center dann immer die korrekte Position ergibt, weiß ich nicht. Eigentlich müsste zref auch dafür erkennen, ob wir uns auf einer geraden oder ungeraden Seite befinden, was offenbar nicht immer korrekt funktioniert. Also müsste man eventuell schon hier stattdessen mit \ifthispageodd arbeiten und den Referenzpunkt abhängig davon selbst berechnen.

Am besten schickst du den ursprünglichen zref-Code mal an den zref-Autor und fragst ihn, warum das nicht funktioniert.

Auch ein

Beitrag von Auch ein »

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.

IRM
Forum-Anfänger
Forum-Anfänger
Beiträge: 42
Registriert: Do 11. Feb 2016, 07:08

Schöne Weihnachten und Nachfrage

Beitrag von IRM »

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?

Antworten