书写答案的垂直间距

书写答案的垂直间距

我找不到此问题的任何答案,所以我希望各位 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}

问题是,当分页符位于此类列表的中间时,页面上的最后一个问题最终会与底部齐平,因此没有书写空间(底部边距除外)。此外,列表开头上方的间距会展开,以尝试补偿拉伸。

我想要的是

  1. 强制在每个问题后留出垂直空间,即使在页面底部
  2. 保持问题部分开头上方的垂直空间正常 - 可以将额外空间添加到页面底部的问题,或将其均匀拉伸到\item枚举列表中的 s
  3. 无需在分页符处输入手动命令即可做到这一点,因为
    • 如果在编辑时分页发生变化,那么纠正起来会很麻烦,而且
    • 这显然违背了 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}

相关内容