【问题标题】:How to load latex .sty files from a subdirectory?如何从子目录加载乳胶 .sty 文件?
【发布时间】:2011-04-25 14:14:49
【问题描述】:

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

\usepackage{sty/prettythesis}

这可行,但是用 xelatex 编译 main.tex 并使用 rubber 会给我一个警告:

sty/prettythesis.sty: You have requested package `sty/prettythesis',
but the package provides `prettythesis'. (page 1)

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

【问题讨论】:

    标签: latex packages xelatex


    【解决方案1】:

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

    \makeatletter
    \def\input@path{{../one-directory/}{../another-directory/}}
    \makeatother
    
    \documentclass{myclass} 
    \usepackage{mypackage}
    

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

    set TEXINPUTS=../one-directory/;../another-directory/;%TEXINPUTS%
    pdflatex myfile.tex
    

    【讨论】:

    • 这大概也适用于背页,这就是为什么它比在unix shell上修改路径更好。
    【解决方案2】:

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

    \usepackage{sty/prettythesis}
    

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

    sty/prettythesis.sty: You have requested package `sty/prettythesis',
    but the package provides `prettythesis'. (page 1)
    

    如果您只想摆脱此警告,并且您可以对 .sty 文件进行少量修改,那么您只需将 \ProvidesPackage 命令更改为

    \ProvidesPackage{sty/prettythesis}
    

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

    更好的是,如果你有一个特定的、修改过的标准 TeX 包的版本(比如,this patch of natbib),那么包名的变化清楚地表明它提供的是什么包,如果你重复使用该文件,然后它(很可能)会重新发出警告,提示您确保知道自己在做什么。

    【讨论】:

      【解决方案3】:

      我相信这个帖子在这里:

      谈论完全相同的事情:看来,唯一的选择是使用TEXINPUTS 环境变量;或使用import package。 (请注意,...Including tex files pg 3. 上的 import 包有一个变体

      关于 TEXINPUTS 的更多信息:

      希望这会有所帮助;
      干杯!

       

      编辑:我希望可以直接在 tex 文件中设置 TEXINPUTS 路径(通过使用 \write18 - 注意,某些版本的 LaTeX 使用 --enable-write18,我的使用 -shell-escape 来启用 @ 987654337@;另见this) - 但似乎不可能:

      ...这是不可能的。...设置了子进程的环境变量,但这对其父进程(TeX)没有影响。”( Re: Setting the environmental variable TEXINPUTS within latex - comp.text.tex)。

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

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

      然后它将直接解析myfile.tex 文件中的\usepackage{mypackage} - 即使mypackage.sty 位于子目录中,例如./subdir/mypackage.sty

      【讨论】:

      【解决方案4】:

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

      export TEXINPUTS=".:./sty:"
      

      然后将您的包引用为:

      \usepackage{prettythesis}
      

      【讨论】:

      • 在我的情况下,这样做会使其无法找到其他包。如何知道哪些默认目录也要添加到环境变量中?
      • 根据官方文档,它应该找到系统包。 (我系统中的“man pdftex”是这样说的)。你没有错过最后的冒号(“:”)吗?
      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多