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 \pagegoal
e \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). \baselineskip
deve 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 \parskip
seja 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 \hbox
aviso.
Editar:Alterei o código, para que funcione em páginas sem texto. Novamente, -0.4pt
ajusta a largura da linha e evita um overfull \vbox
aviso.
Isso precisa de um \newpage
antes 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í -\baselineskip
por -\lineskip-0.4pt
para corrigir isso (novamente, -0.4pt
para ajustar as linhas).
Observação:se outra largura de linha for usada para os quadros, todas as ocorrências de -0.4pt
deverã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
tcolorbox
oferece height fill
opçõ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}