![书写答案的垂直间距](https://linux22.com/image/282708/%E4%B9%A6%E5%86%99%E7%AD%94%E6%A1%88%E7%9A%84%E5%9E%82%E7%9B%B4%E9%97%B4%E8%B7%9D.png)
我找不到此问题的任何答案,所以我希望各位 LaTeX 专家能够帮助我。
我正在为 KOMA 班级制定学习指南scrbook
。其中有(枚举的)讨论问题列表,需要有垂直空间来写下答案。(我想这类似于编写测试,所以一定有人以前做过这件事,可以告诉我怎么做……)
我所做的非常奇怪,我只是在 s\vskip
之间手动插入了 s \item
,如下所示:
\begin{enumerate}
\item Here is the first question.
\vskip 3cm % space to write an answer
\item Here is a second question.
\vskip 3cm
\item Hey look another question.
\vskip 3cm
\end{enumerate}
问题是,当分页符位于此类列表的中间时,页面上的最后一个问题最终会与底部齐平,因此没有书写空间(底部边距除外)。此外,列表开头上方的间距会展开,以尝试补偿拉伸。
我想要的是
- 强制在每个问题后留出垂直空间,即使在页面底部
- 保持问题部分开头上方的垂直空间正常 - 可以将额外空间添加到页面底部的问题,或将其均匀拉伸到
\item
枚举列表中的 s - 无需在分页符处输入手动命令即可做到这一点,因为
- 如果在编辑时分页发生变化,那么纠正起来会很麻烦,而且
- 这显然违背了 LaTeX 的精神。
提前感谢您的帮助,我相信它会比我想象的更容易!
编辑:按照建议,我将开始阅读enumitem
文档,但同时这里有一个完整的 LaTeX 文件,说明问题 3 如何没有获得其全部空间。
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{enumitem}
\setlist[enumerate]{itemsep=8\baselineskip, after=\vspace{8\baselineskip}}
\begin{document}
Lorem ipsum dolor sit amet...
\vskip 8cm
...pronunciation e plu sommun paroles.
\section*{Discussion}
\begin{enumerate}
\item This is the first question
\item This is the second question; both of these should share the
extra stretch from Question 3
\item Here's the third question,
which should trigger a pagebreak so it can get its full allotment of vspace.
\item Question
\item Question
\item Question
\end{enumerate}
Lorem ipsum dolor sit amet...
\end{document}
再次编辑:stackexchange 不允许我在 8 小时内回答我自己的问题,因此我将其放在了这里...
所以这个enumitem
包对我没有帮助;也许可以让它做我想做的事,但真正起作用的是将每个都放在一个(LaTeX 不会破坏)\item
中,如下所示:\parbox[t]{\linewidth}{item text goes here}
\documentclass{article}
\usepackage[showframe]{geometry}
\begin{document}
Lorem ipsum dolor sit amet...
\vskip 8cm
...pronunciation e plu sommun paroles.
\section*{Discussion}
\begin{enumerate}
\item \parbox[t]{\linewidth}{This is the first question\vskip 8\baselineskip}
\item \parbox[t]{\linewidth}{This is the second question; both of these should
share the extra stretch from Question 3\vskip 8\baselineskip}
\item \parbox[t]{\linewidth}{Yay, I'm on the next page!.\vskip 8\baselineskip}
\item \parbox[t]{\linewidth}{Were any of questions 1-3 actually
questions?\vskip 8\baselineskip}
\end{enumerate}
Lorem ipsum dolor sit amet...
\end{document}
答案1
始终发布完整(最少)的文档,因为这样可以省去撰写合适答案的大量猜测,但假设文档相对简单,也许这就是您的意思:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[showframe]{geometry}
\usepackage{enumitem}
\setlist[enumerate]{itemsep=8\baselineskip, after=\vspace{8\baselineskip}}
% cheap trick to 'require' \item to have '8\baselineskip':
\usepackage{etoolbox} % \apptocmd
\usepackage{needspace} % \needspace
\apptocmd{\item}{\needspace{8\baselineskip}}{}{}
\begin{document}
\null\vfill
some text.
\begin{enumerate}
\item Q.
\item Q.
\item Q.
\end{enumerate}
% \newpage % <-- uncomment to compare
%
%
more text.
\end{document}
评论
阅读文档以enumitem
了解它允许的其他选项/可能性。 \usepackage[showframe]{geometry}
只是为了帮助您直观地了解正在发生的事情。我认为使用某个倍数\baselineskip
对于您要求的更严格的“3cm”更为可取,但如果您真的需要它是 3 cm,则可以轻松更改。
答案2
我将定义一个命令\answerspace
附加到问题中:
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{enumitem}
\newcommand{\answerspace}[1][8]{\par\nopagebreak\vspace*{#1\baselineskip}}
\begin{document}
Lorem ipsum dolor sit amet...
\vskip 8cm
...pronunciation e plu sommun paroles.
\section*{Discussion}
\begin{enumerate}[before={\widowpenalty 10000 }]
\item This is the first question\nopagebreak
\item This is the second question; both of these should share the
extra stretch from Question 2\answerspace[12]
\item Here's the third question,
which should trigger a pagebreak so it can get its full allotment of vspace.\answerspace
\item Question\answerspace
\item Easy question\answerspace[2]
\item Question\answerspace
\end{enumerate}
Lorem ipsum dolor sit amet...
\end{document}
该命令有一个可选参数(默认8
)来设置所需的空间。我还添加了一个设置,以便\widowpenalty
在下一个空格中至少留出两行。如果您的问题超过两行,并且您不想将它们拆分到多个页面,请使用
before={\widowpenalties 1 10000 }
答案3
这是一种类似于您在发布的问题中已经暗示的方法。不同之处在于环境的排版方式与任何其他列出的环境一样。但内部的定义\item
已更改。
\documentclass{article}
\makeatletter
\def\ae@vspace{\par\vspace{2in}}
%% you'll redefine \item. The first time it's used
%% you want to open a minipage. But you need to re-redefine
%% \item because upon subsequent calls you want to close
%% the previous minipage.
\def\ae@item@i{%%
\let\item\ae@item@ii
\old@enum@item
\begin{minipage}[t]{\linewidth}}
\def\ae@item@ii{%%
\ae@vspace
\end{minipage}%%
\par
\old@enum@item
\begin{minipage}[t]{\linewidth}}
%% A new environment for handling and managing the spacing.
\newenvironment{myenum}
{\begin{enumerate}
\let\old@enum@item\item
\let\item\ae@item@i%%
{\ae@vspace\end{minipage}\end{enumerate}}
\makeatother
\usepackage[margin=0.5in]{geometry}
\usepackage{lipsum}
\begin{document}
\begin{myenum}
\item \lipsum[1]
\item \lipsum[2]
\item \lipsum[3]
\item \lipsum[4]
\item \lipsum[5]
\item \lipsum[6]
\item \lipsum[7]
\item \lipsum[8]
\item \lipsum[9]
\item \lipsum[10]
\item \lipsum[11]
\item \lipsum[12]
\end{myenum}
\end{document}
答案4
如上所述,我终于回来“回答我自己的问题”;对不起,新的回复者,我还没有时间去调查你们的解决方案——我相信它们以后会有用的!
所以这个enumitem
包对我没有帮助;也许可以让它做我想做的事,但真正起作用的是将每个都放在一个(LaTeX 不会破坏)\item
中,如下所示:\parbox[t]{\linewidth}{item text goes here}
\documentclass{article}
\usepackage[showframe]{geometry}
\begin{document}
Lorem ipsum dolor sit amet...
\vskip 8cm
...pronunciation e plu sommun paroles.
\section*{Discussion}
\begin{enumerate}
\item \parbox[t]{\linewidth}{This is the first question\vskip 8\baselineskip}
\item \parbox[t]{\linewidth}{This is the second question; both of these should
share the extra stretch from Question 3\vskip 8\baselineskip}
\item \parbox[t]{\linewidth}{Yay, I'm on the next page!.\vskip 8\baselineskip}
\item \parbox[t]{\linewidth}{Were any of questions 1-3 actually
questions?\vskip 8\baselineskip}
\end{enumerate}
Lorem ipsum dolor sit amet...
\end{document}