Kennt zref-savepos keine Seitenumbrüche?

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Rolli
Forum-Guru
Forum-Guru
Beiträge: 350
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Kennt zref-savepos keine Seitenumbrüche?

Beitrag von Rolli »

Hallo,
ich hätte gerne einen Befehl \MyMark, der genau an der Stelle, wo er steht, am linken Seitenrand eine spezielle Markierung ausgibt. Hier mein MWE:
Minimalbeispiel
\documentclass{scrartcl}
\usepackage[absolute]{textpos}
\usepackage{zref-savepos}
\usepackage{blindtext}

\newcounter{MarkCtr}

\newcommand{\MyMark}[1]{%
\stepcounter{MarkCtr}%
\zsavepos{POS\theMarkCtr}%
\begin{textblock}{20mm}(5mm,\dimexpr 297mm - \zposy{POS\theMarkCtr}sp\relax)%
\Huge\textbf{#1}
\end{textblock
}}%

\begin{document}
\MyMark{1}
\blindtext
\MyMark{2}
\blindtext
\MyMark{3}
\blindtext
\MyMark{4}
\blindtext
\MyMark{5}
\blindtext
\MyMark{6}
\blindtext
\MyMark{7}
\blindtext
\MyMark{8}
\blindtext
\end{document}
[/MWE]
Der Blindtext wird korrekterweise auf die nächste Seite umgebrochen, meine Markierungen sind jedoch fälschlicher Weise alle auf der ersten Seite.
Wenn ich nach jedem \blindtext eine Leerzeile einfüge, funktioniert es wie gewünscht.
Wenn ich hinter jedes \blindtext ein \par einfüge, funktioniert es bis auf die Markierung "6" wie gewünscht - die "6" steht dann fälschlicher Weise immer noch auf Seite 1.
Ich suche schon seit Stunden herum - was mache ich falsch?
Danke für jede Hilfe!


KOMA (als gast)

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von KOMA (als gast) »

Dein (falsch markierter) Code erzeugt bei mir mit aktuellen TeX Live eine Reihe von Fehlern beginnend mit:

Code: Alles auswählen

Missing number, treated as zero.
<to be read again> 
                   \let 
l.16 \MyMark{1}

Dein Problem liegt aber eher nicht bei zref-savepos, sondern bei dessen Verwendung. Wenn nämlich \zsavepos und textblock verwendet werden, ist der von \blindtext erst in der Ausgaberoutine von LaTeX ggf. verursachte Seitenumbruch noch gar nicht erfolgt. Für TeX ist dein ganzes Dokument ja erst einmal ein einziger Absatz und der wird erst umbrochen, wenn er vollständig ist, bei dir also beim \end{document}. Und erst, nachdem der Absatz selbst umbrochen ist, erfolgt der Seitenumbruch. Zu dem Zeitpunkt sind die ganzen textblock-Umgebungen aber längst ausgeführt. Das sollte auch erklären, warum sich die Ausgabe ändert, wenn zusätzliche Absätze mit \par oder Leerzeilen eingefügt werden.

IMHO wäre das gewünschte mit \marginpar{…} (ggf. zusammen mit mparhack) oder mit scrlayer-notecolumn oder mit marginnote einfacher zu erreichen. Bei \marginpar ist zu beachten, dass es den Absatz nicht selbst beginnt, also am Absatzanfang ein \leavevmode voranzustellen wäre.

Code: Alles auswählen

\documentclass{scrartcl}
\usepackage{blindtext}

\newcommand{\MyMark}[1]{%
  \leavevmode
  \reversemarginpar\marginpar{\Huge\textbf{#1}}%
  \ignorespaces
}

\begin{document}
\MyMark{1}
\blindtext
\MyMark{2}
\blindtext
\MyMark{3}
\blindtext
\MyMark{4}
\blindtext
\MyMark{5}
\blindtext
\MyMark{6}
\blindtext
\MyMark{7}
\blindtext
\MyMark{8}
\blindtext
\end{document}

Achtung! Das \reversemarginpar wirkt sich ggf. auch auf andere \marginpar aus. Das Problem tritt beispielsweise mit scrlayer-notecolumn nicht auf. Dafür braucht das Paket mehrere LaTeX-Läufe, bis die Randnotizen am richtigen Platz stehen:

Code: Alles auswählen

\documentclass{scrartcl}
\usepackage{blindtext}
\usepackage{scrlayer-notecolumn}
\DeclareNewNoteColumn[position=5mm,width=20mm,font=\Huge\bfseries]{MyMark}

\usepackage{showframe}

\newcommand{\MyMark}[1]{\makenote*[MyMark]{#1}}

\begin{document}
\MyMark{1}
\blindtext\marginpar{Hier steht eine normale Randnotiz}
\MyMark{2}
\blindtext
\MyMark{3}
\blindtext
\MyMark{4}
\blindtext
\MyMark{5}
\blindtext
\MyMark{6}
\blindtext
\MyMark{7}
\blindtext
\MyMark{8}
\blindtext
\end{document}

Achtung: Für das Paket marginnote gibt es keinen Support durch den Autor mehr. Das Paket scrlayer-notecolumn ist ein Proof-of-concept und hat daher auch nur einen eingeschränkten Support (siehe dazu die Anleitung).

Hinweis: Code in Beiträgen ist mit dem code-Tag zu markieren, der über den </>-Knopf in der Toolbar zu erreichen ist. der MWE-Tag erzeugt dagegen den Minimalbeispiel-Link. Siehe auch die BBCode-Kurzhilfe.


gastg

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von gastg »

KOMA (als gast) hat geschrieben:
Mo 9. Nov 2020, 08:04

Dein (falsch markierter) Code erzeugt bei mir mit aktuellen TeX Live eine Reihe von Fehlern

Das liegt übrigens daran, dass textblock keine Längen als Koordinaten erwartet, sondern Zahlen. Die Einheiten sind \TPHorizModule und \TPVertModule. Diese sind auf 1/16tel der Breite bzw. der Höhe des Papiers voreingestellt.

Ich vermute, dass eigentlich textblock* verwendet werden sollte. In einem Minimalbeispiel sollte so ein Fehler aber natürlich nicht drin sein. Siehe dazu auch den letztem Absatz in der Minimalbeispiel-Anleitung.


KOMA (als gast)

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von KOMA (als gast) »

gastg hat geschrieben:
Mo 9. Nov 2020, 08:24
KOMA (als gast) hat geschrieben:
Mo 9. Nov 2020, 08:04

Dein (falsch markierter) Code erzeugt bei mir mit aktuellen TeX Live eine Reihe von Fehlern

Das liegt übrigens daran, dass textblock keine Längen als Koordinaten erwartet, sondern Zahlen. Die Einheiten sind \TPHorizModule und \TPVertModule. Diese sind auf 1/16tel der Breite bzw. der Höhe des Papiers voreingestellt.

Ich vermute, dass eigentlich textblock* verwendet werden sollte.

Ah, danke für den Hinweis. Ich verwende das Paket selbst nicht. Ich hätte das natürlich recherchieren können, betrachte es aber nicht wirklich als meine Aufgabe, erst die Nebenfehler in einem Minimalbeispiel zu beseitigen. Bei einem Minimalbeispiel von einem Forum-Guru gehe ich erst recht davon aus, dass das Minimalbeispiel auch wirklich getestet und daher genau so gemeint ist. Aber vielleicht wurde der Stern ja durch die fehlende Code-Markierung verschluckt.


Rolli
Forum-Guru
Forum-Guru
Beiträge: 350
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von Rolli »

Minimalbeispiel
\documentclass{scrartcl}
\usepackage[absolute]{textpos}
\usepackage{zref-savepos}
\usepackage{blindtext}

\newcounter{MarkCtr}

\newcommand{\MyMark}[1]{%
\stepcounter{MarkCtr}%
\zsavepos{POS\theMarkCtr}%
\begin{textblock}{20mm}(5mm,\dimexpr 297mm - \zposy{POS\theMarkCtr}sp\relax)%
\Huge\textbf{#1}
\end{textblock
}}%

\begin{document}
\MyMark{1}
\blindtext\par
\MyMark{2}
\blindtext\par
\MyMark{3}
\blindtext\par
\MyMark{4}
\blindtext\par
\MyMark{5}
\blindtext\par
\MyMark{6}
\blindtext\par
\MyMark{7}
\blindtext\par
\MyMark{8}
\blindtext\par
\end{document}
[/MWE]


Rolli
Forum-Guru
Forum-Guru
Beiträge: 350
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von Rolli »


\documentclass{scrartcl}
\usepackage[absolute]{textpos}
\usepackage{zref-savepos}
\usepackage{blindtext}

\newcounter{MarkCtr}

\newcommand{\MyMark}[1]{%
\stepcounter{MarkCtr}%
\zsavepos{POS\theMarkCtr}%
\begin{textblock}{20mm}(5mm,\dimexpr 297mm - \zposy{POS\theMarkCtr}sp\relax)%
\Huge\textbf{#1}
\end{textblock
}}%

\begin{document}
\MyMark{1}
\blindtext\par
\MyMark{2}
\blindtext\par
\MyMark{3}
\blindtext\par
\MyMark{4}
\blindtext\par
\MyMark{5}
\blindtext\par
\MyMark{6}
\blindtext\par
\MyMark{7}
\blindtext\par
\MyMark{8}
\blindtext\par
\end{document}


Rolli
Forum-Guru
Forum-Guru
Beiträge: 350
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von Rolli »

Code: Alles auswählen

\documentclass{scrartcl}
\usepackage[absolute]{textpos}
\usepackage{zref-savepos}
\usepackage{blindtext}

\newcounter{MarkCtr}

\newcommand{\MyMark}[1]{%
\stepcounter{MarkCtr}%
\zsavepos{POS\theMarkCtr}%
\begin{textblock*}{20mm}(5mm,\dimexpr 297mm - \zposy{POS\theMarkCtr}sp\relax)%
\Huge\textbf{#1}
\end{textblock*}}%

\begin{document}
\MyMark{1}
\blindtext\par
\MyMark{2}
\blindtext\par
\MyMark{3}
\blindtext\par
\MyMark{4}
\blindtext\par
\MyMark{5}
\blindtext\par
\MyMark{6}
\blindtext\par
\MyMark{7}
\blindtext\par
\MyMark{8}
\blindtext\par
\end{document}

Rolli
Forum-Guru
Forum-Guru
Beiträge: 350
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von Rolli »

Hi, Danke Euch zunächst für den Input.

Natürlich verwende ich in meinem MWE textpos*. Und damit funktioniert mein MWE natürlich! Ich verwende MikTEX 2.9 und LuaLaTEX.

Wie Ihr sehen könnt, habe ich gerade den Upload getestet. Mit dem MWE- und dem t-Button wird das Sternchen nachweislich "verschluckt" - warum das so ist - ??? Bug in der Forum-Software - oder Feature?

Bitte um Entschuldigung für das falsche MWE. Ich war länger nicht aktiv und kenne dieses neues Forum-Programm noch nicht richtig.

Ich kann KOMA's Erklärung nachvollziehen, das gibt Sinn, besten Dank. Leider komme ich erst im Laufe der Woche dazu, mich intensiv mit dem Workaround-Vorschlägen zu beschäftigen.

Melde mich dann nochmals - Danke, Rolli


gast

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von gast »

Rolli hat geschrieben:
Mo 9. Nov 2020, 22:45

Wie Ihr sehen könnt, habe ich gerade den Upload getestet. Mit dem MWE- und dem t-Button wird das Sternchen nachweislich "verschluckt"

Die beide für ein vollständiges Minimalbeispiel falsch sind. Richtig ist allein der </>-Button, weil nur der Code-Tags einfügt. Der t-Tag stellt dagegen nur auf Typewriter um.

Um zu testen, ob der Beitrag korrekt angezeigt wird, gibt es übrigens den Vorschau-Knopf. Man muss dazu nicht die Diskussion mit sinnlosen Beiträgen vollmüllen. Notfalls erstellt man sich einen Test-Thread im Off-Topic-Bereich.

Ich glaube übrigens nicht, dass die korrekte Randmarkierung als Workaround gedacht ist. Vielmehr sind das Lösungsvorschläge für dein eigentliches Problem, statt für deinen vollkommen ungeeigneten Versuch, das eigentliche Problem zu lösen.


KOMA (als gast)

Re: Kennt zref-savepos keine Seitenumbrüche?

Beitrag von KOMA (als gast) »

In der Tat ist es vollkommen sinnlos und sehr störend, die Diskussion mit Testbeiträgen vollzumüllen, nachdem ich bereits erklärt habe, wie es richtig geht. Es sei aber noch darauf hingewiesen, dass * in Markdown zur Hervorhebung verwendet wird. Das passiert aber nur, wenn Markdown aktiviert ist. Ist es nicht aktiviert, dann kann man sehr wohl \begin{textblock*} und \end{textblock*} auch mit t-Tags setzen. Und, dass der MWE-Button nicht für den Code eines Minimalbeispiels ist, sondern für den Minimalbeispiel-Link, erfährt man ja bereits aus der Tooltip-Hilfe (Mauszeiger auf den Button setzen und kurz warten). Außerdem habe ich das oben auch schon erklärt.

Und ja, meine Vorschläge sind als Hinweise auf Mechanismen zu verstehen, die für die Lösung des eigentlichen Problems gedacht sind. Weshalb das Vorgehen von Rolli dagegen unter welchen Umständen fehlschlagen muss, habe ich ja ebenfalls erklärt. Es gibt übrigens weitere Pakete zum Setzen von Randnotizen. Meine Vorschläge sind daher wirklich nur Vorschläge. Wer ein anderes Paket verwenden oder vorführen will, darf das gerne tun. Dagegen muss man bei der Verwendung von Paketen wie textpos selbst erst einmal dafür sorgen, dass man beim Aufruf der entsprechenden Platzierungsbefehle auch auf der richtigen Seite ist. Das funktioniert innerhalb eines Absatzes eher schlecht. Natürlich könnte man sich aber mit zusätzlichen abfragen und weiteren Paketen wie afterpage da auch etwas zurecht basteln. Nur landet man dann vermutlich irgendwann bei dem, was das eine oder andere Randnotiz-Pakete auch macht, hat sich also womöglich unnötig Arbeit gemacht.

PS: Zu Erklärungen genötigt zu werden, wie meine Beiträge zu verstehen sind, gehört zu den Dingen, die ich gar nicht mag. Ich bevorzuge es, eine kurze Antwort zu geben und nie wieder daran denken zu müssen.


Antworten