Eigene LaTeX-Vorlagen mit relativen Pfaden schreiben, Unterschied zwischen Include, Input, Class

Eigene LaTeX-Vorlagen mit relativen Pfaden schreiben, Unterschied zwischen Include, Input, Class

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 includeund inputin diesem Zusammenhang nicht ganz oder ob ich meine Vorlage stattdessen in eine Klasse umwandeln sollte.

Antwort1

Wie inhttps://tex.stackexchange.com/a/250/162943, \inputgibt den Inhalt der Datei erneut ein und includesfügt hinzu clearpagesund kann nicht verschachtelt werden. Ich würde bei bleiben \input.
Der Befehl \graphicspatherhä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 subfilesPaket 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 subfilesPaket 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, \inputkopieren 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. \includeerstellt immer eine neue Seite, auf der der Inhalt abgelegt wird, und kann nicht verschachtelt werden.

Der Vorteil der Verwendung \includebesteht darin, dass Sie am Anfang des Dokuments \includeonlymit 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, \includesodass ich nicht warten musste, bis die anderen Abschnitte kompiliert waren, wenn ich an einem davon arbeitete. Ich habe dann für die Unterabschnitte verwendet, \inputda 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.styBeachten 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, \includewird jedoch nicht empfohlen, da \usepackageeinige 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 . importEs 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.clsist jetzt relativ zur Datei, my_document.texwährend das CLS die Grafiken direkt von seinem eigenen Standort bezieht. Damit das funktioniert, templatesmuss 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:

Wo platziere ich meine eigenen .sty- oder .cls-Dateien, um sie für alle meine .tex-Dateien verfügbar zu machen?

Wie schreibe ich ein LaTeX-Paket, das nicht nur .sty- und .cls-Dateien, sondern auch einige Logos in den Formaten .pdf oder .eps bündelt?

mit besondersDasAntwort für Standardpfade.

verwandte Informationen