Zeichnen einer Tikz-Linie am Rand für mehrere Seiten

Zeichnen einer Tikz-Linie am Rand für mehrere Seiten

Inspiriert durch einen Codeabschnitt, den ich auf dieser Site gefunden habe (ich kann mich nicht erinnern ...), könnte ich Folgendes tun, um auf der ersten Seite eine Linie zu zeichnen, die oben beginnt:

\documentclass[a4paper,12pt]{book}
\usepackage{tikz}
\usepackage{etoolbox}
\usepackage{lipsum}

\begin{document}

\thispagestyle{empty}

\begin{tikzpicture}[remember picture,overlay]
    \node (back names) [shape=rectangle,
    fill=black!80, 
    minimum height=\textheight, 
    minimum width=1cm, 
    anchor=north west] 
    at ([yshift=-(1in+\topmargin+\headheight+\headsep)]current page.north west) {};
\end{tikzpicture}

First line.
Second line.
\lipsum

\end{document}

Ich möchte das Rechteck bis zum Ende eines langen Textes ausdehnen (damit eine „Umgebung“ erstellt werden kann und/oder ein neuer Befehl mit einem Parameter, der den Text berücksichtigt) und genau am Anfang dieses Textes beginnen und genau dort enden können, wo er endet, selbst wenn Anfang oder Ende in der Mitte der Seite sind, UND (Tiebraker ;))ohne Verwendung einer Box.

Tatsächlich weiß ich, wie man das macht, indem man zum Beispiel mdframed verwendet und die linke Leiste nach links verschiebt... Es funktioniert gut und es ist schönAberwir wissen, dass zwei zerbrechliche/teilbare Boxen, die mit Framed, MDFramed, Tcolorbox usw. erstellt wurden, nicht verschachtelt werden können (zumindest in den Fällen, die ich versucht habe, nicht einmal ineinander). Aber genau das möchte ich tun: Die Linie (die eigentliche große Regel), die ich mit Tikz zeichne, wird als Container verwendet und ich kann andere zerbrechliche/teilbare Boxen darin platzieren ...

Ist das möglich? Schon mal gemacht?

EDIT: die Inspiration ist hier:Ganze TikZ-Seite mit absoluter Knotenpositionierung.

Antwort1

Dies verwendet tikzpagenodes, tikzmark und everypage. Vergessen Sie nicht, es zweimal auszuführen.

Ich habe eine Umgebung hauptsächlich deshalb verwendet, um Fehler zu vermeiden. Andererseits habe ich vergessen, verschachtelte Umgebungen zu erwähnen.

\documentclass[a4paper,12pt]{book}
\usepackage{tikzpagenodes}
\usetikzlibrary{calc,tikzmark}
\usepackage{lipsum}
\usepackage{showframe}
\usepackage{everypage}

\makeatletter
\newcommand{\checkmarkpage}[4]% #1 = tikzmark label, #2 = less, #3 = equal, #4 = greater
{\@ifundefined{save@pt@#1}{#2}{%
  \edef\markid{\csname save@pt@#1\endcsname}%
  \edef\markpage{\csname save@pg@\markid\endcsname}%
  \ifnum\thepage<\markpage\relax #2%
  \else
    \ifnum\thepage=\markpage\relax #3%
    \else #4%
    \fi
  \fi}%
}
\makeatother

\newcounter{outlineid}
\newcounter{outlinedone}

\newenvironment{outline}{\par\tikzmark{begin\theoutlineid}\ignorespaces}%
  {\par\tikzmark{end\theoutlineid}\stepcounter{outlineid}\ignorespaces}

\newcommand{\drawoutline}{\checkmarkpage{begin\theoutlinedone}{}%
  {\begin{tikzpicture}[remember picture,overlay]
    \path ({pic cs:begin\theoutlinedone}-| current page text area.west)
      ++(0pt,\ht\strutbox) coordinate(A);
    \checkmarkpage{end\theoutlinedone}%
      {\path (current page text area.south west) ++(0pt,-\dp\strutbox)
         coordinate(B);}%
      {\path ({pic cs:end\theoutlinedone}-| current page text area.west)
        ++(0pt,\ht\strutbox) coordinate(B);}%
      {}% this should not happen
    \fill[yellow] ($(A) + (-.333em,0pt)$) rectangle ($(B) + (-1cm,0pt)$);
   \end{tikzpicture}}%
  {\begin{tikzpicture}[remember picture,overlay]
    \coordinate (A) at (current page text area.north west);
    \checkmarkpage{end\theoutlinedone}%
      {\path (current page text area.south west) ++(0pt,-\dp\strutbox)
         coordinate(B);}%
      {\path ({pic cs:end\theoutlinedone}-| current page text area.west)
        ++(0pt,\ht\strutbox) coordinate(B);}%
      {}% this should not happen
    \fill[yellow] ($(A) + (-.333em,0pt)$) rectangle ($(B) + (-1cm,0pt)$);
   \end{tikzpicture}}%
  \checkmarkpage{end\theoutlinedone}{}%
    {\stepcounter{outlinedone}\drawoutline}%
    {}% this should not happen
 }
\AddEverypageHook{\drawoutline}

\begin{document}

\newpage 

\thispagestyle{empty}

\lipsum[1]

Next line begins the rule :

\begin{outline}
\lipsum[2]
\end{outline}

Line above ends the rule.

Two on one page:
\begin{outline}
\lipsum[3]
\end{outline}

One on three pages:
\begin{outline}
\lipsum[4-12]
\end{outline}
That's all, folks.

\end{document}

Antwort2

Dies ist ein Anfang der Antwort. Ich kann jetzt die Regel von einer beliebigen Linie zu einer anderen beliebigen Linie ziehenauf der selben Seite. Der nächste Schritt besteht darin, einen Weg zu finden, um:

1) Beenden der Regel am Ende der Seite vor der letzten Zeile;

2) zur nächsten Seite gehen (so etwas wie aktuelle Seite+1 ??);

3) Wiederholen Sie 1)-2) bis zum Ende des Textes …

Und sicherlich noch ein oder zwei weitere Dinge, da das \zsavepos{lineend} des Codes unten nicht berücksichtigt, dass diese Position 1, 2, 3... x Seiten nach der ersten liegen kann! Und woher soll man das wissen?...

Wichtig für mich...): Ich habe einen Codeausschnitt (dimwithoutpt) aus einem Codeabschnitt namens dimtomm (wandelt ein Dim in pt in mm um) verwendet, aber ich verstehe die Syntax von dimexpr nicht wirklich (ich habe den etex-man gelesen, aber... hmm!). Wenn mir jemand erklären könnte, wie der Code gelesen werden muss, wäre das großartig :-).

Vielleicht gibt es eine sauberere Möglichkeit, die Konvertierung und die Einstellung von \beg und \portionheight durchzuführen, aber ich bin mit dieser Art der Manipulation überhaupt nicht vertraut ...

\documentclass[a4paper,12pt]{book}
\usepackage{tikz}
\usepackage{etoolbox}
\usepackage{lipsum}
\usepackage{showframe}
\usepackage{layout}
\usepackage{zref-savepos}

\makeatletter
\newcommand\dimwithoutpt[1]{%
    \strip@pt\dimexpr 1\dimexpr#1\relax\relax%
}
\makeatother

\newlength\beg
\newlength\portionheight

\begin{document}
\layout{}

\newpage 

\thispagestyle{empty}

\lipsum[1]

Next line begins the rule :

\zsavepos{linedeb}Begining of my new section.

\setlength{\beg}{dimwithoutpt{\paperheight-\zposy{linedeb}sp}pt}

\lipsum[2]\zsavepos{lineend} 
\setlength{\portionheight}{\dimwithoutpt{\zposy{linedeb}sp-\zposy{lineend}sp}pt}

\begin{tikzpicture}[remember picture,overlay]
    \node (back names) [shape=rectangle, fill=yellow, minimum height=\portionheight, minimum width=1cm, anchor=north west] at ([yshift=-\beg,xshift=1in+\oddsidemargin-1cm]current page.north west) {};
\end{tikzpicture}
Line above ends the rule.

And next : 

\lipsum[3]

\end{document}

verwandte Informationen