Ich versuche, eine vorhandene Klasse zu ändern, um ihre Verwendung zu vereinfachen. Im Grunde möchte ich nur, dass der Benutzer einen Ordner kopiert, der die .cls
Datei und einige Ressourcen enthält (eine PNG-Datei mit einem Logo, einige Schriftarten und eine Textdatei mit einigen Informationen, die von der .cls
Datei gelesen werden sollen).
Mein Problem ist, dass ich die .cls
Dateien nicht finden kann. Ich verwende beispielsweise, \InputIfFileExists{./<nameoftextfile>}{}{\ClassError...}
aber das funktioniert nicht (es gibt immer den Fehler aus).
Gibt es eine Möglichkeit, auf eine Datei im selben Ordner wie die .cls
Datei zu verweisen?
Übrigens, wenn ich die Klassendatei im texmf-local
Ordner „installieren“ würde, wie würde ich dann auf die Ressourcen verweisen (die ich dann in einige Unterordner von texmf-local legen würde)? Es erscheint nicht sinnvoll, den Pfad zum texmf-Ordner in der Datei fest zu codieren .cls
.
Antwort1
Normalerweise sollte es problemlos funktionieren, auf eine andere Datei im selben Verzeichnis zu verweisen, wie Sie es getan haben. Es reicht jedoch schon aus, zu sagen \InputIfFileExists{<nameoftextfile>}{}{\ClassError...}
. (Aber: <nameoftextfile>
wird nicht ausreichen. Die Erweiterung muss da sein!) Um auch in TeX auf ein Verzeichnis eine Ebene darüber zu verweisen, würden Sie verwenden ../<dir>
. Die folgende Konfiguration sollte das gewünschte Ergebnis erzielen.
Verzeichnis-Setup
texmf-local
|
+-- dir myclass
| |
| +-- file myclass.cls
| +-- file myexternalfile.tex
|
+-- dir resources
| |
| +-- file resource.tex
Dateien
main.tex
\RequirePackage{filecontents}
\begin{filecontents}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2017/01/22 Example LaTeX class]
\LoadClass{article}
\InputIfFileExists{myexternalfile.tex}{}{\ClassError{myclass}{file not found}{}}
\InputIfFileExists{../resources/resource.tex}{}{\ClassError{myclass}{file not found}{}}
\end{filecontents}
\documentclass{myclass}
\begin{document}
\mymacro{} \myothermacro
\end{document}
myexternalfile.tex
\def\mymacro{hello}
resource.tex
\def\myothermacro{world}
Antwort2
So wie ich es verstehe, haben Sie ein Verzeichnis mit einer Reihe von Dateien. Eine davon ist die .cls
Datei und die anderen sind Dinge, die von der Datei gelesen werden sollen .cls
.
Der Benutzer hat vermutlich ein .tex
Dokument, das Ihre Klasse aufruft
\documentclass{fabulousclass}
...
.tex
Die einfachste Möglichkeit für Benutzer, Ihre Klasse zu verwenden, besteht darin, das Dokument mit allem anderen in das Verzeichnis zu legen .
Ihre Klasse kann einfach sagen:
\input{extensionfile}% extensionfile.tex
\input{configfile.cfg}% configfile.cfg
\includegraphics{logo}% logo.png
Dann wird alles gefunden.
Wenn Sie nicht möchten, dass Benutzer Ihr Verzeichnis zu ihrem Arbeitsverzeichnis machen müssen, müssen Sie ihnen mitteilen, dass sie die Dateien installieren sollen.
Die Details hängen von Ihrer TeX-Distribution ab. Für TeX Live gibt es zwei Hauptoptionen:
TEXMFHOME
TEXMFLOCAL
Die erste Option ist die einfachste. Benutzer erstellen einfach ein Verzeichnis in ihrem persönlichen TEXMF-Baum. Auf einem Unix-ähnlichen System:
mkdir -p $(kpsewhich -var TEXMFHOME)/tex/latex
# where fabulousclassdirectoryname is the name of the directory containing your class and resources
mv -n fabulousclassdirectoryname $(kpsewhich -var TEXMFHOME)/tex/latex/
Dann werden die Dateien unabhängig vom Arbeitsverzeichnis gefunden.
Das Verfahren ist dasselbe, allerdings TEXMFLOCAL
mit einem zusätzlichen Schritt. Dieser Vorgang erfordert normalerweise zumindest auf Unix-ähnlichen Systemen Privilegien.
mkdir -p $(kpsewhich -var TEXMFLOCAL)/tex/latex
# where fabulousclassdirectoryname is the name of the directory containing your class and resources
mv -n fabulousclassdirectoryname $(kpsewhich -var TEXMFLOCAL)/tex/latex/
mktexlsr $(kpsewhich -var TEXMFLOCAL)
Das ist alles.
Sie können die Ressourcen in ein anderes Unterverzeichnis von TEXMFLOCAL
oder ablegen TEXMFHOME
, wenn Sie möchten. Aber ich verstehe nicht, warum Sie das tun sollten, und es würde die Leute nur verwirren.