我正在尝试修改现有类以简化其使用。基本上,我只是希望用户复制一个包含文件.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-ish 系统上:
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 系统上的权限。
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
。但我不明白您为什么要这样做,这只会让人感到困惑。