Kontrollieren Sie den vertikalen Abstand vor leeren Miniseiten

Kontrollieren Sie den vertikalen Abstand vor leeren Miniseiten

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:

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

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 \vfilwird 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 \fboxsepplus gemessen \fboxrule; das ergibt 6,83331+3+0,4=10,23331 Punkte. Das überschreitet den Grenzwert deutlich, deshalb verwendet TeX \lineskipzwischen 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) \baselineskipminus 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 ( \lineskipanstatt \baselineskip), deshalb füge ich gerne \struts 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}

ganzseitiges Bild

verwandte Informationen