Desenhar linha tikz na margem para várias páginas

Desenhar linha tikz na margem para várias páginas

Inspirado por uma parte do código encontrada neste site (não me lembro...), eu poderia fazer o seguinte para desenhar uma linha na primeira página começando no topo:

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

O que eu gostaria de fazer é estender o retângulo até o final de um texto longo (para que possa haver um 'ambiente' para construir e/ou um novo comando com um parâmetro levando em conta o texto), e poder comece exatamente no início deste texto e termine exatamente onde ele termina, mesmo que o início ou o fim esteja no meio da página, AND (tiebraker ;))sem usar uma caixa.

Na verdade, eu sei como fazer isso usando, por exemplo, mdframed e deslocando para a esquerda a barra esquerda... Funciona bem e é legalmassabemos que duas caixas quebráveis/divisíveis criadas com framed, mdframed, tcolorbox, etc. não podem ser aninhadas (mesmo uma com a outra, pelo menos nos casos que tentei). Mas é isso que eu quero fazer: a linha (a grande regra na verdade) que estou desenhando com o tikz será usada como container e poderei colocar outras caixas quebráveis/dividíveis dentro dela...

Isso é possível? Sempre feito?

EDIT: a inspiração está aqui:Página inteira TikZ com posicionamento absoluto de nó.

Responder1

Isso usa tikzpagenodes, tikzmark e everypage. Não se esqueça de executá-lo duas vezes.

Usei um ambiente principalmente para dificultar a bagunça. OTOH, esqueci de abordar ambientes aninhados.

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

Responder2

Este é o começo da resposta. Agora posso desenhar a regra de uma linha arbitrária para outra linha arbitráriaNa mesma página. O próximo passo é encontrar uma maneira de:

1) parar a regra no final da página antes da última linha;

2) ir para a próxima página (algo como página atual+1 ??);

3) repetindo 1)-2) até o final do texto...

E certamente mais uma ou duas coisas porque o \zsavepos{lineend} do código abaixo não leva em conta o fato de que esta posição pode ser 1, 2, 3... x páginas depois da primeira! E como saber disso?...

Importante para mim...): Usei um trecho de código (dimwithoutpt) de uma parte do código chamada dimtomm (transforme um dim em pt em mm), mas não entendo muito bem a sintaxe do dimexpr (li o etex-man, mas... hmm !). Se alguém puder me explicar como o código deve ser lido, seria ótimo :-).

Talvez exista uma maneira mais limpa de fazer a conversão e configuração de \beg e \portionheight, mas não estou familiarizado com esse tipo de manipulação...

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

informação relacionada