Dibujar una línea tikz en el margen para varias páginas

Dibujar una línea tikz en el margen para varias páginas

Inspirándome en una parte del código que se encuentra en este sitio (no lo recuerdo...), podría hacer lo siguiente para dibujar una línea en la primera página comenzando desde arriba:

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

Lo que me gustaría hacer es extender el rectángulo hasta el final de un texto largo (para que pueda haber un 'entorno' para construir y/o un nuevo comando con un parámetro que tenga en cuenta el texto) y poder comenzar exactamente al principio de este texto y terminar exactamente donde termina, incluso si el comienzo o el final están en el medio de la página, Y (desempate ;))sin usar una caja.

De hecho, sé cómo hacer esto usando, por ejemplo, mdframed y desplazando hacia la izquierda la barra izquierda... Funciona bien y es agradable.perosí sabemos que dos cajas rompibles/divisibles creadas con framed, mdframed, tcolorbox, etc. no se pueden anidar (incluso una con otra, al menos en los casos que probé). Pero eso es lo que quiero hacer: la línea (la gran regla de hecho) que estoy dibujando con tikz se usará como contenedor y podré poner otras cajas rompibles/divisibles dentro de ella...

¿Es eso posible? ¿Jamás se ha hecho?

EDITAR: la inspiración está aquí:Página completa de TikZ con posicionamiento absoluto de nodos.

Respuesta1

Esto utiliza tikzpagenodes, tikzmark y eachpage. No olvides ejecutarlo dos veces.

Utilicé un entorno principalmente para que fuera difícil equivocarse. OTOH, olvidé abordar los entornos anidados.

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

Respuesta2

Este es el comienzo de la respuesta. Ahora puedo trazar la regla de una línea arbitraria a otra línea arbitraria.en la misma pagina. El siguiente paso es encontrar una manera de:

1) detener la regla al final de la página delante de la última línea;

2) ir a la página siguiente (algo así como página actual+1 ??);

3) repitiendo 1)-2) hasta el final del texto...

Y ciertamente una o dos cosas más porque el \zsavepos{lineend} del código siguiente no tiene en cuenta el hecho de que esta posición puede estar 1, 2, 3... x páginas después de la primera. ¿Y cómo saber eso?...

Importante para mí...): Utilicé un fragmento de código (dim withoutpt) de una porción de código llamada dimtomm (transformar un dim en pt a mm), pero realmente no entiendo la sintaxis de dimexpr (leí etex-man, pero... hmm !). Si alguien puede explicarme cómo se debe leer el código, sería genial :-).

Tal vez haya una forma más limpia de realizar la conversión y la configuración de \beg y \portionheight, pero no estoy del todo familiarizado con este tipo de manipulación...

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

información relacionada