矩形直到页面末尾

矩形直到页面末尾

占据页面三分之一的文本。之后需要绘制一个矩形,该矩形将一直延伸到当前页面的末尾。基本上这是一张试卷,我为学生提供空间,让他们在空白框中写下答案。

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

在此处输入图片描述

相关内容