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}