Retângulo até o final da página

Retângulo até o final da página

Algum texto que ocupa um terço da página. Depois disso, é necessário desenhar um retângulo que continuará até o final da página atual. Basicamente é um papel de perguntas e estou disponibilizando espaços para os alunos escreverem suas respostas na caixa vazia.

\begin{tikzpicture}
\node (rect) at (0,0) [draw, text width=16.6 cm, minimum height=7cm]{};
\node[below right, text width=16.6 cm] at (rect.north west) {};
\end{tikzpicture}

\pagebreak

Algum texto com uma linha. Depois disso, o retângulo deve ser desenhado até o final da página.

\begin{tikzpicture}
\node (rect) at (0,0) [draw, text width=16.6 cm, minimum height=7cm]{};
\node[below right, text width=16.6 cm] at (rect.north west) {};
\end{tikzpicture}

Como você pode ver, estou escrevendo explicitamente a largura e a altura mínima do texto. Gostaria de fazer isso automaticamente, com a largura e altura da página para que o retângulo seja feito automaticamente dependendo do espaço que sobra após a última linha. O início do retângulo, entretanto, pode estar em qualquer lugar da página. (EDIT: O início do retângulo começa após o final da linha anterior)

Responder1

Você pode calcular a altura restante de uma página com a ajuda de \pagegoale \pagetotal. Este último contém a altura do texto até o momento e o primeiro a altura disponível para o texto (não \textheight, pois pode haver pontos flutuantes e/ou notas de rodapé na página). \baselineskipdeve ser subtraído, porque a imagem começa em uma nova linha. E \parskipé subtraído, então a caixa fica definida mais abaixo do texto caso um valor diferente de zero \parskipseja usado.

Também tomei a liberdade de ajustar a largura para \textwidth. O -0.4pté um ajuste para a largura das linhas.Editar:Caso contrário, haverá um overfull \hboxaviso.

Editar:Alterei o código, para que funcione em páginas sem texto. Novamente, -0.4ptajusta a largura da linha e evita um overfull \vboxaviso.

Isso precisa de um \newpageantes do retângulo em uma página sem texto.

Editar 2:o retângulo não chegou até a parte inferior da página. Substituí -\baselineskippor -\lineskip-0.4ptpara corrigir isso (novamente, -0.4ptpara ajustar as linhas).

Observação:se outra largura de linha for usada para os quadros, todas as ocorrências de -0.4ptdeverão ser substituídas por -<new line width>. Caso contrário, poderão ocorrer caixas muito cheias ou o retângulo em uma página com texto poderá ser movido para a próxima página.

Editar 3:removido -parskip. Isso não era necessário.

\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{lipsum}

\newdimen\remainingheight
\newcommand*{\calcremainingheight}{%
    \ifdim\pagegoal=\maxdimen
        \remainingheight\dimexpr\textheight-0.4pt\relax
    \else
        % edit 2: replaced -\baselineskip by -\lineskip-0.4pt
        % edit 3: removed -\parskip
        \remainingheight\dimexpr\pagegoal-\pagetotal-\lineskip-0.4pt\relax
    \fi
}

\parskip2ex
\parindent0pt

\begin{document}
\lipsum[1]

\noindent
\begin{tikzpicture}
\calcremainingheight
\node (rect) at (0,0) [draw, minimum width=\textwidth-0.4pt, minimum height=\remainingheight]{};
%\node[below right, text width=16.6 cm] at (rect.north west) {};
\end{tikzpicture}

\lipsum[1-2]

\noindent
\begin{tikzpicture}
\calcremainingheight
\node (rect) at (0,0) [draw, minimum width=\textwidth-0.4pt, minimum height=\remainingheight]{};
%\node[below right, text width=16.6 cm] at (rect.north west) {};
\end{tikzpicture}

% needed for a page with no text before the rectangle
\newpage
\noindent
\begin{tikzpicture}
\calcremainingheight
\node (rect) at (0,0) [draw, minimum width=\textwidth-0.4pt, minimum height=\remainingheight]{};
%\node[below right, text width=16.6 cm] at (rect.north west) {};
\end{tikzpicture}
\end{document}

Responder2

Aqui estão duas soluções. Um deve ser colocado no final da linha anterior do texto. O outro deve ser colocado no início de uma nova linha de texto. Ignora recuo ou centralização.

Observe que no modo de sobreposição, a origem estará localizada na linha de base, portanto é necessário algum deslocamento. \strutboxé do mesmo tamanho que \strut.

Não se esqueça de executá-lo duas vezes.

\documentclass{article}
\usepackage{tikzpagenodes}
\usepackage{lipsum}% MWE only

\begin{document}
Some text on one line.
\begin{tikzpicture}[remember picture,overlay]% still on same line as text
  \path (0pt,-\dp\strutbox) -| (current page text area.west) coordinate[midway] (start);
  \draw (start) rectangle (current page text area.south east);
\end{tikzpicture}

\lipsum[1-6]

\begin{tikzpicture}[remember picture,overlay]% start of new paragraph
  \path (0pt,\ht\strutbox) -| (current page text area.west) coordinate[midway] (start);
  \draw (start) rectangle (current page text area.south east);
\end{tikzpicture}
\lipsum[7-11]
\end{document}

Responder3

tcolorboxoferece height fillopções para resolver este tipo de problemas:

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}

\begin{document}
\lipsum[1]
\begin{tcolorbox}[height fill, title=Your solution]
\end{tcolorbox}

\lipsum[2]
\begin{tcolorbox}[height fill, sharp corners, colback=white]
\end{tcolorbox}
\end{document}

insira a descrição da imagem aqui

informação relacionada