Прямоугольник до конца страницы

Прямоугольник до конца страницы

Какой-то текст, занимающий треть страницы. После этого нужно нарисовать прямоугольник, который будет продолжаться до конца текущей страницы. По сути, это вопросительный лист, и я предоставляю студентам место для записи своих ответов в пустом поле.

\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

Какой-нибудь текст в одну строку. После этого прямоугольник должен быть нарисован до конца страницы.

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

Как видите, я явно пишу ширину текста и минимальную высоту. Я бы хотел сделать это автоматически, с шириной и высотой страницы, чтобы прямоугольник создавался автоматически в зависимости от оставшегося пространства после последней строки. Начало прямоугольника, однако, может быть в любом месте страницы. (ПРАВКА: Начало прямоугольника начинается после конца предыдущей строки)

решение1

Вы можете рассчитать оставшуюся высоту страницы с помощью \pagegoalи \pagetotal. Последний содержит высоту текста на данный момент, а первый — высоту, доступную для текста (не \textheight, поскольку на странице могут быть плавающие элементы и/или сноски). \baselineskipнеобходимо вычесть, поскольку изображение начинается с новой строки. И вычитается, поэтому поле устанавливается дальше под текстом в случае использования \parskipненулевого значения .\parskip

Я также позволил себе отрегулировать ширину до \textwidth. -0.4ptЭто настройка ширины линий.Редактировать:В противном случае будет выдано overfull \hboxпредупреждение.

Редактировать:Я изменил код, так что он работает для страниц без текста. Опять же, он -0.4ptподстраивается под ширину строки и предотвращает overfull \vboxпредупреждение.

Это необходимо \newpageперед прямоугольником на странице без текста.

Редактировать 2:прямоугольник не дошел до самого низа страницы. Я заменил -\baselineskipна , -\lineskip-0.4ptчтобы исправить это (опять же, -0.4ptчтобы подстроиться под линии).

Примечание:если для рамок используется другая ширина линии, все вхождения -0.4ptдолжны быть заменены на -<new line width>. В противном случае могут возникнуть переполненные поля или прямоугольник на странице с текстом может быть перемещен на следующую страницу.

Редактировать 3:удалено -parskip. Это было не обязательно.

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

решение2

Вот два решения. Одно из них предназначено для размещения в конце предыдущей строки текста. Другое предназначено для размещения в начале новой строки текста. Оно игнорирует отступы и центрирование.

Обратите внимание, что в режиме наложения начало координат будет расположено на базовой линии, поэтому потребуется некоторое смещение. \strutboxимеет тот же размер, что и \strut.

Не забудьте запустить его дважды.

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

решение3

tcolorboxпредлагает height fillварианты решения такого рода проблем:

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

введите описание изображения здесь

Связанный контент