
Я пытаюсь изменить существующий класс, чтобы упростить его использование. По сути, я бы просто хотел, чтобы пользователь скопировал папку, содержащую файл .cls
и некоторые ресурсы (файл png с логотипом, некоторые шрифты и текстовый файл с некоторой информацией, которую должен прочитать файл .cls
).
Моя проблема в том, что я не могу заставить .cls
файл найти файлы. Например, я использую, \InputIfFileExists{./<nameoftextfile>}{}{\ClassError...}
но это не работает (всегда выдает ошибку).
Есть ли способ сослаться на файл, находящийся в той же папке, что и .cls
файл?
Кстати, если бы я "устанавливал" файл класса в texmf-local
папку, как бы я ссылался на ресурсы (которые я бы затем поместил в некоторые подпапки texmf-local)? Кажется неразумным жестко кодировать путь к папке texmf в файле .cls
.
решение1
Обычно ссылка на другой файл в том же каталоге, как вы сделали, должна отлично работать. Однако, уже достаточно указать \InputIfFileExists{<nameoftextfile>}{}{\ClassError...}
. (Но: <nameoftextfile>
этого будет недостаточно. Расширение должно быть там!) Чтобы сослаться на каталог на один уровень выше, также в TeX, вы должны использовать ../<dir>
. Следующая настройка должна достичь того, что вы ищете.
Настройка каталога
texmf-local
|
+-- dir myclass
| |
| +-- file myclass.cls
| +-- file myexternalfile.tex
|
+-- dir resources
| |
| +-- file resource.tex
Файлы
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}
решение2
Насколько я понимаю, у вас есть каталог с кучей файлов. Один из них — файл .cls
, а остальные — то, что файл должен прочитать .cls
.
У пользователя, предположительно, есть .tex
документ, который вызывает ваш класс
\documentclass{fabulousclass}
...
Самый простой способ для пользователей использовать ваш класс — поместить .tex
документ в каталог со всем остальным.
Ваш класс может просто сказать:
\input{extensionfile}% extensionfile.tex
\input{configfile.cfg}% configfile.cfg
\includegraphics{logo}% logo.png
Тогда все будет найдено.
Если вы не хотите, чтобы пользователи делали ваш каталог своим рабочим каталогом, вам нужно сообщить им о необходимости установки файлов.
Детали зависят от вашего дистрибутива TeX. Для TeX Live есть два основных варианта:
TEXMFHOME
TEXMFLOCAL
Первый вариант самый простой. Пользователи просто создают каталог в своем личном дереве TEXMF. В системе Unix:
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/
Тогда файлы будут найдены независимо от рабочего каталога.
Процедура та же самая TEXMFLOCAL
с дополнительным шагом. Этот процесс обычно требует привилегий на Unix-ish-системах, по крайней мере.
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)
Вот и все.
Вы можете поместить ресурсы в другой подкаталог TEXMFLOCAL
или , TEXMFHOME
если хотите. Но я не понимаю, зачем вам это нужно, и это только запутает людей.