
Ich arbeite in einer Windows-Umgebung mit Miktex. Die meisten meiner Dokumente werden mit XeLaTeX erstellt, aber ich glaube, mein Problem ist nicht compilerspezifisch.
Ich möchte eine Vorlage mit allen Paketinhalten, Kopfzeileneinstellungen und Grafikpfaden erstellen, um beispielsweise Kopfzeilenlogos einzubinden. In allen Dokumenten, die die Vorlage verwenden, möchte ich nur dokumentspezifische Einstellungen und Dokumentinhalte haben. Mein Problem ist, dass sich die Dokumente möglicherweise in einem anderen Ordner als die Vorlage befinden, ich aber trotzdem Bilder aus dem Vorlagenordner einbinden möchte. Meine Einstellungen sehen folgendermaßen aus:
.
├── templates/
│ ├── my_template.tex
│ └── pictures/
│ └── header_logo.pdf
└── documents/
├── my_document.tex
└── pictures/
└── some_picture.png
Minimale Beispiele könnten sein:
meine_vorlage.tex:
\documentclass[
11pt,
a4paper,
]{scrarticle}
\usepackage{scrextend}
\usepackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{./pictures/}}
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
mein_dokument.tex:
\input{../templates/my_template.tex}
\graphicspath{{./pictures/}}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Meine Frage ist nun, was die Standardmethode ist, um dies zu erreichen. Ich fanddiese Fragesehr hilfreich, aber ich brauche etwas mehr Details zu den verschiedenen Ansätzen, um herauszufinden, welcher geeignet ist. Ich verstehe den Unterschied zwischen include
und input
in diesem Zusammenhang nicht ganz oder ob ich meine Vorlage stattdessen in eine Klasse umwandeln sollte.
Antwort1
Wie inhttps://tex.stackexchange.com/a/250/162943, \input
gibt den Inhalt der Datei erneut ein und includes
fügt hinzu clearpages
und kann nicht verschachtelt werden. Ich würde bei bleiben \input
.
Der Befehl \graphicspath
erhält als Argument eine Liste von Ordnern: \graphcispath{{folder1}{folder2}}
, daher schlage ich vor, den vollständigen Pfad für Ihren Vorlagenbildordner (templates/pictures) und einen relativen Pfad für den Dokumentbildordner (documents/pictures) zu verwenden, der vermutlich immer den gleichen Namen hat.
meine_vorlage.tex:
\documentclass[
11pt,
a4paper,
]{scrarticle}
\usepackage{scrextend}
\usepackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{C:/Path/to/template/image/folder}{./pictures/}}
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
mein_dokument.tex:
\input{../templates/my_template.tex}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Eine andere Lösung wäre die Verwendung symbolischer Links. Erstellen Sie einen symbolischen Link des Vorlagenbildordners innerhalb Ihres Projektbildordners und verwenden Sie nur \graphicspath{{./pictures/}}
. In diesem Fall müssen Sie daran denken, den Namen des Ordners in jedem hinzuzufügen includegraphics
.
Antwort2
Um absolute Pfade zu vermeiden, können Sie das subfiles
Paket verwenden (auch wenn der Hauptanwendungsfall etwas anders ist). Die erforderlichen Änderungen sind:
Machen Sie aus der Vorlage ein vollständiges Dokument, indem Sie hinzufügen
\begin{document}\end{document}
.Am Ende der Präambel der Vorlage wird das
subfiles
Paket geladen und anschließend der Grafikpfad festgelegt, dieser darf jedoch nur auf die für die Vorlage relevanten Bildverzeichnisse verweisen und dabei relative Pfade verwenden.Beginnen Sie Ihr eigentliches Dokument mit der Zeile
\documentclass[rel.path to template]{subfiles}
Fügen Sie in der Präambel des eigentlichen Dokuments dem Grafikpfad weitere lokale Bildverzeichnisse hinzu.
Der Vorteil gegenüber anderen Lösungen besteht darin, dass die Vorlage nur die für die Vorlage relevanten Bildverzeichnisse kennen muss und die Dokumente ihre spezifischen Bilder in Verzeichnissen ablegen können, die nicht identisch sein müssen. Darüber hinaus sind keine absoluten Pfade erforderlich.
Für Ihr Beispiel sehen diese Änderungen wie folgt aus:
% templates/my_template.tex
\documentclass[
11pt,
a4paper,
]{scrarticle}
\usepackage{scrextend}
\usepackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\usepackage{graphicx}
\usepackage{subfiles}
\graphicspath{{./pictures/}}% <<< PICTURES LOCAL TO template DIRECTORY
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
\begin{document}% <<< NECESSARY FOR subfiles TO WORK
\end{document}% <<< NECESSARY FOR subfiles TO WORK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% documents/my_document.tex
\documentclass[../templates/my_template]{subfiles}% <<< LOAD PREAMBLE FROM ../templates/my_template.tex
\makeatletter% <<< EXTEND THE GRAPHICS SEARCH PATH BY LOCAL DIRECTORIES
\edef\Ginput@path{\Ginput@path{./pictures/}}% <<<<<<<<<<<<<<<<<
\makeatother% <<<<<<<<<<<<<<<<<
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Antwort3
Wie in einer der anderen Antworten erwähnt, \input
kopieren Sie den Text direkt aus einer anderen Datei, als ob Sie ihn gerade manuell kombiniert hätten. Dies ist im Allgemeinen die einfachste Vorgehensweise und kann bei großen Dokumenten verschachtelt werden. \include
erstellt immer eine neue Seite, auf der der Inhalt abgelegt wird, und kann nicht verschachtelt werden.
Der Vorteil der Verwendung \include
besteht darin, dass Sie am Anfang des Dokuments \includeonly
mit einer Liste von Dateinamen verwenden können und dann alle Includes, die einen anderen Dateinamen angeben, ignoriert werden. Ich habe dies bei sehr großen Projekten verwendet, bei denen die Hauptabschnitte verwendet wurden, \include
sodass ich nicht warten musste, bis die anderen Abschnitte kompiliert waren, wenn ich an einem davon arbeitete. Ich habe dann für die Unterabschnitte verwendet, \input
da Sie nicht verschachteln können \include
. Sie können es auch andersherum machen, indem Sie die Abschnitte eingeben und die Unterabschnitte einschließen.
Es ist sehr üblich, die Präambel in eine andere Datei zu schreiben. Es gibt einige Möglichkeiten, dies zu tun, die mehr oder weniger korrekt sind als andere. Die gängigste Methode besteht darin, die Präambel (außer \documentclass
) in eine separate Datei zu schreiben, die Sie beliebig benennen können, z. B. . mypreamble.sty
Beachten Sie, dass sie mit enden muss .sty
, und dann können Sie \usepackage{mypreamble}
jedes andere Paket verwenden. Sie müssen die Zeile auch \ProvidesPackage{mypreabmle}
oben in der Präambeldatei hinzufügen. Dies kann auch mit erfolgen, \include
wird jedoch nicht empfohlen, da \usepackage
einige interne Verarbeitungen durchgeführt werden und optionale Parameter usw. zulässig sind.
Ein weiteres Paket, das für mehrere Dateien nützlich ist, heißt . import
Es ermöglicht die Verwendung eines Befehls wie diesem: \import{path\to\secton}{sectionname.tex}
. Das Schöne daran ist, dass Sie, wenn Sie etwas in eine Datei importieren möchten, die Sie bereits importiert haben, . aufrufen können. \subimport{relitive/path/}{plot1.tex}
Dabei wird ein Pfad relativ zur importierten Datei verwendet, was recht nützlich ist.
Antwort4
Die Antworten von gernot und bryce brachten mich dazu, meine Präambel tatsächlich in eine Datei zu packen .cls
. Ich musste einige der Dateien neu anordnen, so dass mein Dateibaum jetzt so aussieht:
.
├── templates/
│ └── tex/
│ └── latex/
│ └── my_template/
│ ├── my_template.cls
│ └── header_logo.pdf
└── documents/
├── my_document.tex
└── pictures/
└── some_picture.png
my_template.cls wird jetzt
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{my_template}
\LoadClass[
11pt,
a4paper,
]{scrarticle}
\RequirePackage{scrextend}
\RequirePackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\RequirePackage{graphicx}
\graphicspath{{./pictures/}}
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
und my_document.tex wird
\documentclass{my_template}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Der Grafikpfad darin my_template.cls
ist jetzt relativ zur Datei, my_document.tex
während das CLS die Grafiken direkt von seinem eigenen Standort bezieht. Damit das funktioniert, templates
muss das Verzeichnis als eigenes Texmf-Stammverzeichnis initialisiert werden (ich habe das mit gemacht Miktex console --> Settings --> Directories --> Add
). Der Vorteil dieses Setups ist, dass ich die Vorlage von überall auf meinem PC aus verwenden kann, ohne relative oder absolute Pfade zum Verzeichnis angeben zu müssen, in dem sie sich befindet. Das hilft mir sehr bei der GIT-Versionskontrolle.
Weitere Antworten zu diesem Ansatz und Details zu beispielsweise transportablen Installationen gibt es hier:
mit besondersDasAntwort für Standardpfade.