Ich habe eine neue Umgebung definiert, die mithilfe von Fbox eine Art Antwortfeld um eine Miniseite herum zeichnet. Die Umgebung fügt außerdem Text über dem Antwortfeld ein.
Hier ist ein minimales funktionierendes Beispiel:
\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}
Der Einfachheit halber füge ich einen Screenshot der ersten Seite an:
Wie Sie sehen, gibt es einen vertikalen Zwischenraum, wenn das Feld leer ist oder wenn es direkt mit einer Lstlisting-Umgebung beginnt. Ich habe herumgesucht, aber ich habe keine Ahnung, wie dieser Zwischenraum hinzugefügt wird oder wie man ihn wieder loswird.
Und wie kann ich den „Header“-Text mit dem Feld zusammenhalten, wenn er auf die nächste Seite umbricht?
Antwort1
Das Problem besteht darin, wie Sie die Breite der Box sicherstellen. In diesem Fall ist es besser, eine Nullhöhenregel hinzuzufügen, die so breit ist wie die Box. Sie müssen auch etwas Breite abschneiden (für \fboxsep
und \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}
Ihr Code \begin{ansbox}{1.5in}
wurde mit
\begin{minipage}[t][1.5in]{\linewidth}
<environment's contents>
\vfill\hfill
\end{minipage}
Wenn der Umgebungskörper leer ist, führt dies zu
\vfill
\hfill
\par\vfil
(die letzten Token werden hinzugefügt, weil Sie eine [t]
Miniseite möchten; die \vfil
wird durch aufgehoben \vfill
). Der Referenzpunkt der Box wird durch die bestimmt \vfill
. Andererseits haben Sie bei einem nicht leeren Inhalt
My name is
\vfill
\hfill
\vfil
und der Bezugspunkt befindet sich an der Grundlinie des oberen Absatzes; jetzt wird die Höhe der Box als Höhe von M plus \fboxsep
plus gemessen \fboxrule
; das ergibt 6,83331+3+0,4=10,23331 Punkte. Das überschreitet den Grenzwert deutlich, deshalb verwendet TeX \lineskip
zwischen der Zeile „Antwort in die Box schreiben:“ und der Box. Im ersten Fall beträgt die Boxhöhe nur 3,4pt und der Abstand, den Sie sehen, ist (da die Linie oben keine Tiefe hat) \baselineskip
minus 3,4pt.
Bei meiner Lösung hat die Box immer eine Höhe von 3,4 pt, da die Nullhöhenregel den Referenzpunkt bestimmt.
Antwort2
Miniseiten folgen normalerweise den Regeln für den Boxabstand ( \lineskip
anstatt \baselineskip
), deshalb füge ich gerne \strut
s an den Rändern hinzu.
Es gibt noch andere Probleme als das genannte. Ehrlich gesagt bin ich überrascht, dass der Code überhaupt ausgeführt wurde.
Erstens sollten Sie \begin und \end nicht in der Definition einer Umgebung verwenden, da sie in der falschen Reihenfolge erweitert werden. Dies lässt sich am besten mit dem Paket environ erledigen.
Zweitens mag es lstlisting nicht, sich in etwas anderem zu befinden (außer in einer \hbox). Das Paket hat seine eigene Umgebungssoftware.
Wenn Sie einen Seitenumbruch zwischen dem Text und der Box verhindern möchten, können Sie das Paket needspace verwenden.
\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}