Ich möchte eine größere Präsentation in mehrere Teile zerlegen und dann in einem Hauptdokument zusammenfassen. Die einzelnen Teile sollen dabei auch eigenständig übersetzt und verwendet werden können.

Ich bin auf das package subfiles gestoßen, mit dem dies möglich ist. Allerdings gibt es dabei ein Problem mit der eigenständigen Darstellung des subfiles.

Hier das Hauptdokument main.tex:

Open in Online-Editor
\documentclass[12pt]{beamer}
\usepackage{subfiles}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usetheme{AnnArbor}
\usecolortheme{beaver}

\begin{document}
\begin{frame}
  \frametitle{Titel}
  Text
\end{frame}
\subfile{subfile.tex}
\end{document}

Und hier das subfile.tex

Open in Online-Editor
\documentclass[main.tex]{subfiles}
\begin{document}
\begin{frame}
  \frametitle{Titel2}
  Text2
\end{frame}
\end{document}


Grundsätzlich funktioniert es, sowohl das Hauptdokument wie auch das subfile können getrennt übersetzt und angezeigt werden. Allerdings wird bei der eigenständigen Übersetzung des subfiles oben eine weiße Linie eingefügt, so dass die Seite nicht mehr mit dem rot/grauen Balken beginnt.

Mit main.tex:
alt text

Mit subfile.tex:
alt text

Woran liegt das und gibt es Abhilfe?

gefragt 29 Jan '15, 17:59

tom75's gravatar image

tom75
2.2k187884
Akzeptiert-Rate: 57%

Ich hab das gerade mal ausprobiert: bei mir ist kein weißer Balken zu sehen. (Aktuelles TeX Live 2014)

(30 Jan '15, 09:30) cgnieder

@Clemens Wenn ich nur subfile.tex kompiliere, bekomme ich den weißen Balken sowohl mit MiKTeX 2.9 als auch mit einem aktuellen TeX Live 2014, letzteres unter Windows und unter Ubuntu.

(30 Jan '15, 11:31) esdd

@esdd ich bekomme dann eine Reihe Warnungen und Fehler, zuoberst Package auxhook Warning: Cannot patch \document, und ! LaTeX Error: Command \newblock already defined.

(30 Jan '15, 11:37) cgnieder

@Clemens Diese Warnung (und zwei weitere) bekomme ich auch sowie eine overfull \vbox, aber Fehlermeldungen gibt es bei mir keine.

(30 Jan '15, 11:46) esdd

Ich bekomme mit MikTeX (heute nochmals aktualisiert) neben zwei Warnungen zur Font die Meldung Overfull \vbox (11.5pt too high) ... und Cannot patch \document,(auxhook) using \AtBeginDocument instead.

(30 Jan '15, 12:07) tom75

Ich würde ja das standalone-Paket benutzen.

(30 Jan '15, 17:20) Ulrike Fischer

@Ulrike Fischer Das scheint mir nicht so "komfortabel" in Bezug auf eine schnell Umsetzung zu sein.

(31 Jan '15, 09:52) tom75

Ich verstehe nicht, was du meinst. Du musst doch nur überall standalone laden. Ich habe damit letzthin ein Projekt umgesetzt mit an die hundert Dateien, die sowohl einzeln als eingebunden (in mehrfacher Verschachtelung) kompiliert wurden und es war problemlos.

(31 Jan '15, 11:09) Ulrike Fischer

@Ulrike Fischer Wenn ich die Anleitung richtig verstanden habe, muss ich alle Pakete mit \usepackage sowohl im Hauptdokument als auch im ausgelagerten Dokument angeben, d.h. wenn es Änderungen gibt, muss ich dies an zwei Stellen machen. Bei subfiles muss ich es nur im Hauptdokument angeben. Das meinte ich mit komfortabler.

Letztlich, da subfiles ja nicht richtig funktioniert, wird mir wohl nichts anderes übrig bleiben, wenn sich der Fehler nicht beheben lässt.

(31 Jan '15, 12:20) tom75
1

Andererseits ist die sub-Datei dadurch auch in sich vollständig - du musst nicht dauernd die main.tex mitkopieren und du brauchst auch keine speziellen input-Befehle. Du kannst außerdem ja alle gemeinsamen Pakete in eine externe Datei packen und per input{pakete} laden (in dem Projekt wurde eine spezielle Klasse gebaut und alle Dateien hatten nur documentclass{..} in der Präambel).

(31 Jan '15, 14:04) Ulrike Fischer

@Ulrike Fischer Das wusste ich nicht, dass ich die Pakete auslagern kann.

D.h. ich hab eine Datei pakete.tex die aus lauter \input{...} Zeilen besteht und in main.tex und subfile.texschriebe ich dann nach \documentclass nur \input{pakete.tex} ?

Kannst du ein Beispiel machen, wie du das mit der eigenen Klasse gemacht hast? Oder gibts dazu eine Anleitung?

(31 Jan '15, 16:18) tom75

@tom Das mit der eigenen Klasse würde ich dir momentan nicht empfehlen. Aber du kannst ein tex Dokument schreiben, in welchem dann steht

\usepackage{tikz}
\usepackage{mathtools}
\usepackage{hyperref}

Hindert dich ja keiner dran. LaTeX ist sehr simple, wenn man sich mal länger als fünf Minuten Zeit für ein Problem nimmt. Dann ist nichts mehr kompliziert und nirgendwo ist schwarze Magie.

(31 Jan '15, 16:50) Johannes

@Johannes Ich bin halt neugierig. Ich arbeite erst seit einigen Wochen mit LaTeX, es dauert, bis ich mich da eingewöhne. :-)

(31 Jan '15, 17:59) tom75

Neugierig ist gut, aber vorsicht, prokrastiniere nicht soviel. ;-)

(31 Jan '15, 18:04) Johannes
Ergebnis 5 von 14 show 9 more comments

Das Problem ist, dass subfiles.cls bereits vor dem Laden der Hauptdatei \document umdefiniert und auch bereits zu diesem Zeitpunkt die Originaldefinition von \document speichert, um sie nach dem Laden der Präambeldatei wiederherzustellen. Das funktioniert aber nicht, wenn von der verwendeten Klasse \document ebenfalls umdefiniert wird. Das ist im Fall von beamer der Fall.

Die Lösung besteht nun darin, die Definition von \document erst nach dem Laden von beamer zu speichern und zu ändern. Das geht beispielsweise mit Hilfe von scrlfile. Wir definieren also zunächst eine eigene Klasse beamer-subfiles:

Öffne in Overleaf
%%
%% This is file `beamer-subfiles.cls'.
%% This class is an replacement für `subfile.cls' of package `subfiles'
%% by Federico Garcia to be used with beamer.
%% 
%% Copyright 2018 Ijon Tichy
%% 
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%% 
%% This work has the LPPL maintenance status `unmaintained'.
%%
%% Original source: <https://texwelt.de/wissen/fragen/11337>
%% 
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{beamer-subfiles}[2018/04/25 subfiles class replacement by Ijon Tichy]
\DeclareOption*{\typeout{Preamble taken from file `\CurrentOption'}%
    \let\preamble@file\CurrentOption}
\ProcessOptions\relax
\RequirePackage{scrlfile}
\RequirePackage{verbatim}
\AfterClass{beamer}{%
  \let\subfiles@document\document
  \let\document\comment
  \let\subfiles@enddocument\enddocument
  \let\enddocument\endcomment
}
\let\subfiles@documentclass\documentclass
\let\documentclass\LoadClass\relax
\makeatother
\input{\csname preamble@file\endcsname}
\makeatletter
\let\preamble@file\undefined
\let\enddocument\subfiles@enddocument
\let\subfiles@enddocument\undefined
\let\document\subfiles@document
\let\subfiles@document\undefined
\endinput
%%
%% End of file `beamer-subfiles.cls'.

Und ersetzen nun in subfile.tex die Klasse:

Öffne in Overleaf
\documentclass[main.tex]{beamer-subfiles}

\begin{document}
\begin{frame}
  \frametitle{Titel2}
  Text2
\end{frame}
\end{document}

Und schon erhält man beim Übersetzen von subfile.tex ebenfalls:

Frame ohne weißen Rand oben

Da nun auch hyperref via auxhook \document patchen kann, bevor beamer-subfiles die Anweisung speichert und ändert, ist auch das Problem mit der von Clemens festgestellten Warnung behoben.

Wie das Beispiel zeigt, ist die Verwendung von subfiles immer dann problematisch, wenn in der Dokumentpräambel \document geändert wird. Das betrifft beispielsweise auch etoolbox. Einige Hooks dieses Pakets funktionieren mit subfiles nicht mehr, wenn etoolbox erst in der Dokumentpräambel des Hauptdokuments = Präambeldokuments geladen wird. Hier stellt sich die Frage, ob es nicht grundsätzlich besser wäre, im Hauptdokument \begin{document}…\end{document} durch eine neue, von subfiles.sty bereitgestellte Umgebung \begin{maindocument}…\end{maindocument} zu ersetzen. Damit müsste dann in subfiles.cls nicht mehr \document und \enddocument umdefiniert werden, so dass Änderungen daran, die in der Klasse oder Präambel des Hauptdokuments vorgenommen werden, weiterhin auch für einzeln übersetzte Unterdokumente wirksam blieben.

Permanenter link

beantwortet 25 Apr '18, 11:08

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

@Ijon Tichy Vielen Dank!

(23 Sep '18, 13:29) tom75
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×138
×2

gestellte Frage: 29 Jan '15, 17:59

Frage wurde gesehen: 6,732 Mal

zuletzt geändert: 23 Sep '18, 13:29