如何从子目录加载latex .sty文件?

Bru*_*uno 42 latex packages xelatex

我使用了一些不属于texlive的.sty文件,并希望将它们放在我的main.tex文件夹的子目录中.我使用以下行加载包:

\usepackage{sty/prettythesis}
Run Code Online (Sandbox Code Playgroud)

这有效,但使用xelatex和使用橡胶编译main.tex 会给我一个警告:

sty/prettythesis.sty: You have requested package `sty/prettythesis',
but the package provides `prettythesis'. (page 1)
Run Code Online (Sandbox Code Playgroud)

有没有办法防止这种警告或处理这种情况,而不必在所有.sty-files'\ ProvidePackage命令中包含"sty \"或设置TEXINPUTS环境变量(这似乎不能从main.tex本身) ?

sda*_*aau 19

我相信这个帖子在这里:

谈到完全相同的事情:看来,唯一的选择是使用TEXINPUTS环境变量; 或使用导入包.(注意,import包装上有一个变体......包括tex文件第3页.)

关于TEXINPUTS的更多信息:

希望这可以帮助;
干杯!

 

编辑:我希望可以直接在tex文件中设置TEXINPUTS路径(通过使用\write18- 并注意,某些版本的LaTeX使用--enable-write18,我的用途-shell-escape启用\write18;另请参阅此内容) - 但似乎不可能:

" ......这是不可能的....设置子进程的环境变量,但这对其父进程(TeX)没有影响. "(Re:在latex中设置环境变量TEXINPUTS - comp.text.tex).

...所以,现在我只需要pdflatex在我的Linux中调用bash:

TEXINPUTS=.//:$TEXINPUTS pdflatex ./myfile.tex

然后它将直接\usepackage{mypackage}myfile.tex文件中解析- 即使mypackage.sty是在子目录中,比如说./subdir/mypackage.sty.


E.P*_*.P. 9

正如您所发现的,将包放在子目录中(例如,./sty/prettythesis.sty相对于位于 的主.tex文件./),然后通过调用包

\usepackage{sty/prettythesis}
Run Code Online (Sandbox Code Playgroud)

将成功加载包,但会产生警告

sty/prettythesis.sty: You have requested package `sty/prettythesis',
but the package provides `prettythesis'. (page 1)
Run Code Online (Sandbox Code Playgroud)

如果您想要的只是摆脱此警告,并且您可以对文件进行少量修改.sty,那么您可以简单地更改它报告的包名称,方法是将命令更改\ProvidesPackage

\ProvidesPackage{sty/prettythesis}
Run Code Online (Sandbox Code Playgroud)

如果您要在负载周围移动它,这可能会很不方便,但修改负载也不错。

更好的是,如果您拥有的是标准 TeX 包的特定修改版本(例如natbib 的这个补丁),那么包名称的更改清楚地表明了它提供的包,并且如果您重用文件,那么它(很可能)会重新发出警告,提示您确保您知道自己在做什么。


Ale*_*ukh 6

您可以在 TeX 文件中执行此操作,而无需更改系统环境(不要忘记/每个目录的尾部斜杠):

\makeatletter
\def\input@path{{../one-directory/}{../another-directory/}}
\makeatother

\documentclass{myclass} 
\usepackage{mypackage}
Run Code Online (Sandbox Code Playgroud)

不过,出于可移植性的考虑,可能不建议采用这种方式。TEXINPUTS正如其他答案提到的,“正确”的方法是在调用乳胶之前在系统环境中设置变量;在 Windows 中是这样的(您可以将其放在批处理文件中):

set TEXINPUTS=../one-directory/;../another-directory/;%TEXINPUTS%
pdflatex myfile.tex
Run Code Online (Sandbox Code Playgroud)


Rud*_*ela 5

只需在 makefile 或构建脚本中调用 pdflatex (或 Latex)之前添加以下行:

export TEXINPUTS=".:./sty:"
Run Code Online (Sandbox Code Playgroud)

然后将您的包引用为:

\usepackage{prettythesis}
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,这样做会使其无法找到其他包。如何知道哪些默认目录也添加到环境变量中? (2认同)
  • 根据官方文档,它_应该_找到系统包。(我的系统中的“man pdftex”是这么说的)。你是不是漏掉了最后一个冒号(“:”)? (2认同)