Какой-то текст, занимающий треть страницы. После этого нужно нарисовать прямоугольник, который будет продолжаться до конца текущей страницы. По сути, это вопросительный лист, и я предоставляю студентам место для записи своих ответов в пустом поле.
\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}