Sie sind hier

Einspaltige Zusammenfassung über zwei Seiten in einem zweispaltigen Dokument

Hallo,

ich bin -- nachdem ich einen Tipp von Markus gelesen hatte -- bei http://tex.stackexchange.com/ über einen Beitrag gestolpert, bei dem beschrieben wird, wie man eine einspaltige Zusammenfassung über mehrere Seiten in einem zweispaltigen Dokument setzen kann. Ich würde das gerne mit den KOMA-Script-Klassen umsetzen.

Leider werden durch die dort beschriebene Lösung dabei vor dem Titel leere Seiten eingefügt - ohne den \maketitle-Befehl geht es. Prinzipiell hab ich das Vorgehen verstanden, allerdings bin ich auf der untersten TeX-Ebene nicht so bewandert, dass ich tatsächlich wüsste, was im einzelnen mit den Boxen passiert, um es verbessern zu können. Hat jemand eine Idee, wie man das Beispiel anpassen könnte, damit es reibungslos funktioniert? Oder gibt es gar einen clevereren Ansatz? Das Minimalbeispiel ist bereits auf KOMA-Script umgestellt.

\documentclass[twocolumn,abstract]{scrartcl}
%\documentclass[twocolumn]{article}
 
\usepackage{blindtext}
 
\makeatletter
\newsavebox\longtwo@box
\def\longtwocolumn{\@ifnextchar[\longtwo@\twocolumn}
\long\def\longtwo@[#1]{%
  \begingroup%
    \let\longtwo@column\twocolumn%
    \let\longtwo@mkttl\maketitle%
    \def\maketitle{%
      \begingroup%
      \let\newpage\relax%
      \longtwo@mkttl%
      \endgroup%
    }%
    \longtwo@column[{%
      \@twocolumnfalse%
      \global\setbox\longtwo@box\vbox{#1}%
      \longtwo@split%
    }]%
    \longtwo@repeat%
  \endgroup
}
\def\longtwo@repeat{%
    \longtwo@column[{%
      \@twocolumnfalse%
      \longtwo@split%
    }]%
  \longtwo@repeat%
}
\def\longtwo@split{%
  \ifdim\ht\longtwo@box>\textheight%
    \begingroup%
    \vbadness10000%
    \setbox0\vsplit\longtwo@box to \textheight%
    \setbox1\vbox{\unvbox\longtwo@box}%
    \global\setbox\longtwo@box\vbox{\unvbox1}%
    \setbox2\vbox to \textheight{%
      \unvbox0%
    }%
    \ht2=0.9\textheight%
    \box2%
    \endgroup%
  \else%
    \ifdim\ht\longtwo@box>0.87\textheight%
      \global\let\longtwo@repeat\clearpage%
    \else%
      \global\let\longtwo@repeat\relax%
    \fi%
    \unvbox\longtwo@box%
  \fi%
}
\makeatother
 
\begin{document}
\title{My title}
\author{My the first}
\longtwocolumn[{
\maketitle%
\begin{abstract}
\Blindtext[6][2]
\end{abstract}
}]
\Blindtext[4][2]
\end{document}
Bild von Markus Kohm

Da wir ja ziemlich genau wissen, woran wir sind, können wir und das Leben vielleicht ein wenig vereinfachen:

\documentclass[twocolumn,abstract]{scrartcl}
 
\usepackage{lipsum}
 
\makeatletter
\newsavebox\twocolumnargbox
\newcommand{\longtwocolumn}[1][]{%
  % Wir wollen zunächst einspaltig arbeiten:
  \onecolumn
  \begingroup
    % Während des Zusammenbaus der Box sind keine expliziten \newpage oder
    % \clearpage erlaubt.
    \let\clearpage\relax
    \let\newpage\relax
    \global\setbox\twocolumnargbox\vbox{%
      #1%
      \bigskip
    }%
  \endgroup
  \typeout{^^J%
    TRACE: Initial height=\the\ht\twocolumnargbox, 
           depth=\the\dp\twocolumnargbox}%
  % Jetzt müssen wir so lange einzelne Seiten ausgeben, bis der Rest der Box
  % kleiner als eine Seite ist.
  \@whiledim \textheight<\ht\twocolumnargbox\do {%
    \typeout{TRACE: Split of \the\textheight\space from 
                    \the\ht\twocolumnargbox}%
    \splittopskip\topskip % Für das Zerteilen dieselben Rahmenbedingungen,
    \splitmaxdepth\maxdepth % die auch für den Seitenaufbau gelten.
    \vsplit\twocolumnargbox to \textheight\clearpage
  }%
  % Den Rest geben wir dann einfach als optionales Argument von \twocolumn aus:
  \typeout{TRACE: Final height=\the\ht\twocolumnargbox, 
                        depth=\the\dp\twocolumnargbox}%
  \twocolumn[\unvbox\twocolumnargbox]%
}
\makeatother
 
\begin{document}
 
\title{Long One Column Abstract with Two Column Document}
\author{Markus Kohm}
 
\longtwocolumn[{
  \maketitle
  \begin{abstract}
  \lipsum[1-20]
  \end{abstract}
}]
 
\section{Here we go}
\lipsum
\end{document}

Im Prinzip arbeitet das Paket scrlayer-notecolumn für die Notiz-Spalten ganz ähnlich.

...für die elegante und vor allem wahnsinnig schnelle Lösung

Hallo Markus,

bis jetzt habe ich mich (fast) ohne Literatur durch die LaTeX-Welt geschlagen. Lediglich den LaTeX-Begleiter von Mittelbach und Goossens sowie die 3. Auflage des KOMA-Script-Buches hatte ich mir mal in der Bibliothek geliehen. Langsam komme ich aber mit meinen Kenntnissen und der Weisheit des Internets an meine Grenzen. Würde ich nicht ständig Hilfe von dir erhalten, hätte ich wohl schon das eine oder andere graue Haar mehr. Deshalb meine Frage: Kannst du mir ein bestimmtes Buch oder auch mehrere Bücher empfehlen, welches inbesondere Paket- und Klassenautoren eine echte Hilfe ist und sich damit -- nach etwas Suche -- tatsächlich Problemstellungen zufriedenstellend lösen lassen. Dass man einiges an Erfahrung braucht, um so spielend leicht wie du Lösungen aus dem Ärmel zu schütteln ist klar. Ich stoße mittlerweile jedoch viel zu häufig an meine Grenzen. Ohne deinen Vorschlag hier beispielsweise wäre ich nie über Befehle wie \splittopskip oder \splitmaxdepth gestolpert. Auch habe ich den Quelltext zwar prinzipiell verstanden, zu 100% dahinter gestiegen bin ich aber immer noch nicht.

Beste Grüße
Falk

Bild von Markus Kohm

Das Beispiel funktioniert auch ohne Setzen von \splittopskip und splitmaxdepth. Das steht da hauptsächlich zur Sicherheit, falls in irgend einem Paket (global statt lokal) ungünstige Werte eingestellt werden. Wenn man so tief einsteigen will, kommt man um das TeXbook fast nicht herum. Das ist aber wirklich schwere Kost. Etwas leichter zu verstehen ist TeX by Topics, das es legal als kostenloses PDF zum Herunterladen gibt und auch in TeX Live 2012 enthalten ist. TeX by Topic ist nicht ganz so tiefgehend, dafür aber auch nicht von einem Informatik-Professor für Informatiker geschrieben.

Eine Fundgrube für den Anfang ist der dokumentierte LaTeX-Quellcode source2e.pdf. Auch das ist in TeX Live 2012 enthalten. Die Teile, die noch aus plainTeX oder aus LaTeX 2.09 stammen sind zwar in der while-Sprache dokumentiert, der Rest ist aber relativ gut erklärt. Außerdem findet man darin auch Hinweise auf Konventionen wie die Benutzbarkeit von Box-Registern mit niedriger Nummer als temporäres Hilfsregister.

Auf jeden Fall gelesen haben sollte man natürlich den clsguide und den fntguide. Beide sind zwar nichts für Anfänger aber sollten bereits von fortgeschrittenen Anwendern verstanden werden. Den usrguide sollte ohnehin jeder parallel zu einer LaTeX-Einführung lesen.

Ein echtes Buch für Paketautoren gibt es IMHO nicht. Ich wollte das tatsächlich einmal schreiben, habe es dann aber aus Zeitgründen aufgegeben. Geld wäre damit ohnehin nicht zu verdienen gewesen. Dafür ist der Markt zu klein.

Heutzutage ist es auch immer eine recht gute Idee, sich den Quellcode von Paketen anzuschauen, die irgend etwas in der gesuchten Richtung machen. Im Beispiel mit dem Zerteilen einer Box hätte man sich vielleicht das framed-Paket anschauen können, das das ja ebenfalls tun muss. Wenn man Glück hat (was beim framed-Paket nicht der Fall ist), ist der Quellcode gut kommentiert und sogar in der Paketdoku enthalten, so dass er gut lesbar ist.

Übrigens habe ich mir irgendwann auch TLC2 angeschafft. Das ist aber tatsächlich das Buch, in dem ich am wenigsten reinschaue. Hin und wieder greife ich zu einer LaTeX-Einführung, um zu sehen, ob da drinsteht, was ich den Anfängern um die Ohren werfe. Selten schaue ich in TeX by Topic nach, Oft schaue ich in source2e und The TeX book. Bei letzterem habe ich inzwischen sogar ein Gefühl dafür entwickelt, wo ungefähr die Antwort steht. Einige Abschnitte wie den über den Absatzumbruch habe ich bestimmt schon ein paar Dutzend Mal gelesen. Komplett durch habe ich das Buch aber erst einmal und damals habe ich nur gefühlt die Hälfte davon verstanden. Und dann gibt es noch ein paar Dinge, die nicht einmal darin zu finden sind – aber das ist eine andere Geschichte, die ein anderes Mal erzählt werden soll.

BTW: So riesige Sammlungen wie KOMA-Script sind nicht immer eine gute Informationsquelle. Beim Ändern finde ich in KOMA-Script immer wieder alten Code, bei dem ich mich frage, was ich mir damals vor rund 20 Jahren (umständliches) gedacht habe. Damals waren meine Informationsquellen tatsächlich The TeX book, source2e und classes.dtx und der kaum kommentierte Quellcode von Script 2.0.

Comments for "Einspaltige Zusammenfassung über zwei Seiten in einem zweispaltigen Dokument" abonnieren