미니페이지 주위에 fbox를 사용하여 일종의 답변 상자를 그리는 새로운 환경을 정의했습니다. 또한 환경에서는 답변 상자 위에 일부 텍스트를 배치합니다.
다음은 최소한의 작업 예입니다.
\documentclass{article}
\usepackage{listings}
\newsavebox{\mybox}
\newenvironment{ansbox}[1]{Write answer in the box:\newline
\begin{lrbox}{\mybox}\begin{minipage}[t][#1]{\linewidth}}
{\vfill\hfill\end{minipage}\end{lrbox}\fbox{\usebox{\mybox}}}
\setlength{\parskip}{\baselineskip}
\setlength{\parindent}{0ex}
\begin{document}
Description of problem.
\begin{ansbox}{2in}
%empty box
\end{ansbox}
What is your name?
\begin{ansbox}{2in}
My name is
\end{ansbox}
Implement a factorial function.
\begin{ansbox}{2in}
\begin{lstlisting}
def factorial(n):
\end{lstlisting}
\end{ansbox}
\end{document}
편의상 첫 페이지의 스크린샷을 첨부합니다.
보시다시피 상자가 비어 있거나 목록 목록 환경으로 즉시 시작될 때 수직 공간이 있습니다. 여기 저기 검색해 보았지만 이 공간이 어떻게 추가되는지, 어떻게 제거하는지 전혀 모르겠습니다.
또한 다음 페이지로 넘어갈 때 "헤더" 텍스트를 상자와 함께 유지하려면 어떻게 해야 합니까?
답변1
문제는 상자의 너비를 어떻게 보장하느냐에 있습니다. 이 경우 상자 너비만큼 높이가 0인 규칙을 추가하는 것이 좋습니다. 또한 일부 너비( \fboxsep
및 의 경우)를 잘라야 합니다 \fboxrule
.
\documentclass{article}
\usepackage{listings}
\newsavebox{\mybox}
\newenvironment{ansbox}[1]
{%
Write answer in the box:\\*
\begin{lrbox}{\mybox}
\begin{minipage}[t][#1]{\dimexpr\linewidth-2\fboxsep-2\fboxrule}
\hrule width \textwidth height 0pt
}
{\end{minipage}\end{lrbox}\fbox{\usebox{\mybox}}}
\setlength{\parskip}{\baselineskip}
\setlength{\parindent}{0ex}
\begin{document}
Description of problem.
\begin{ansbox}{1.5in}
%empty box
\end{ansbox}
What is your name?
\begin{ansbox}{1.5in}
My name is
\end{ansbox}
Implement a factorial function.
\begin{ansbox}{1.5in}
\begin{lstlisting}
def factorial(n):
\end{lstlisting}
\end{ansbox}
\end{document}
귀하의 코드는 다음과 \begin{ansbox}{1.5in}
같습니다.
\begin{minipage}[t][1.5in]{\linewidth}
<environment's contents>
\vfill\hfill
\end{minipage}
환경 본문이 비어 있으면 다음과 같은 결과가 발생합니다.
\vfill
\hfill
\par\vfil
(미니페이지를 원하기 때문에 마지막 토큰이 추가되었습니다 [t]
. 는 \vfil
에 의해 취소됩니다 \vfill
.) 상자의 참조점은 에 의해 결정됩니다 \vfill
. 반면에 비어 있지 않은 내용을 사용하면
My name is
\vfill
\hfill
\vfil
참조점은 맨 위 문단의 기준선에 있습니다. 이제 상자의 높이는 M + \fboxsep
+ 의 높이로 측정됩니다 \fboxrule
. 이는 6.83331+3+0.4=10.23331 포인트가 됩니다. 이는 분명히 임계값을 초과하므로 TeX는 \lineskip
"Write Answer in the box:" 줄과 상자 사이를 사용합니다. 전자의 경우 상자 높이는 3.4pt에 불과하고 눈에 보이는 간격은 (위 선에 깊이가 없으므로) \baselineskip
마이너스 3.4pt입니다.
내 솔루션을 사용하면 상자 높이가 항상 3.4pt가 됩니다. 높이 0 규칙에 따라 참조점이 결정되기 때문입니다.
답변2
미니페이지는 일반적으로 상자 간격 규칙( \lineskip
대신 )을 따르므로 테두리에 s를 \baselineskip
추가하는 것을 좋아합니다 .\strut
언급된 문제 외에 다른 문제도 있습니다. 솔직히 말해서 코드가 전혀 실행되지 않았다는 사실에 놀랐습니다.
첫째, 환경 정의에 \begin 및 \end를 사용하면 순서가 바뀌므로 사용하면 안 됩니다. 이런 종류의 작업은 Environ 패키지를 사용하는 것이 가장 좋습니다.
둘째, lstlisting은 어떤 것(\hbox 제외) 내부에 있는 것을 좋아하지 않습니다. 패키지에는 자체 환경 소프트웨어가 있습니다.
텍스트와 상자 사이의 페이지 나누기를 방지하려면 needspace 패키지를 사용할 수 있습니다.
\documentclass{article}
\usepackage{listings}
\usepackage{environ}
\newsavebox{\mybox}
\NewEnviron{ansbox}[1]{Write answer in the box:\strut\newline
\fbox{\begin{minipage}[t][#1][s]{\dimexpr \linewidth-2\fboxsep-2\fboxrule}
\strut\BODY\vfill\hfill
\end{minipage}}}
\lstnewenvironment{lstbox}{\global\setbox\mybox=\hbox\bgroup}{\egroup}
\setlength{\parskip}{\baselineskip}
\setlength{\parindent}{0ex}
\begin{document}
Description of problem.
\begin{ansbox}{2in}
\end{ansbox}
What is your name?
\begin{ansbox}{2in}
My name is
\end{ansbox}
Implement a factorial function.
\begin{lstbox}
def factorial(n):
\end{lstbox}
\begin{ansbox}{1in}
\usebox{\mybox}
\end{ansbox}
\end{document}