从主*.tex文件的超/子目录中包含*.sty文件

52
我想通过git与许多其他人分享一个latex文档,因此我们决定将所有特殊的sty文件(这些文件并不在每个人的latex安装中都存在)放入资源目录中。如果该目录是实际工作目录的superdir,则会很酷。我应该如何导入这些样式文件?重要的是,即使是这些远程样式的依赖关系也必须与其他远程样式一起解决。
5个回答

39

您可以通过两种方式将样式文件(mystyle.sty)导入到文档中:

  1. 如果该文件在您的路径或与.tex文件在同一文件夹中,只需在导言区包含以下行:\usepackage{mystyle}
  2. 如果该文件在不同的文件夹中,您可以使用完整路径访问它,如下所示:\usepackage{/path/to/folder/mystyle}

话虽如此,如果您不确定样式文件是否在每个人的安装中,请将其包含在相同的目录中,并确保执行git add mystyle.sty并将其与其他文件一起跟踪(尽管大多数情况下不会对其进行更改)。不需要父目录。但是,如果您坚持使用不同的目录,请参见上面的选项2。

最好将其放在子目录中而不是父目录中,因为您仍然可以调用文件\usepackage{subdir/mystyle}并确保调用了您的样式文件。但是,如果您转到父目录,则无法确定其他用户是否有一个同名文件夹不属于您的软件包,这可能会导致错误。


5
这也适用于\documentclass吗?我似乎无法加载位于我的主.tex文件的子文件夹中的类文件。 - Waldir Leoncio
7
正如David Carlisle指出的\usepackage{/path/to/folder/mystyle}能够工作是由于缺乏错误检查。\usepackage{}的参数应该是名称而不是路径,因此第二种方式并不是一个好选择。 - mforbes
有时候拥有子文件夹会很方便,比如处理git子模块时(如果你有Windows和Linux用户的混合环境,符号链接可能无法直接使用)。 - undefined

13

也许对您已经不再相关,但这里有另一种实现您想要的方式。

按照以下方式设置您的Git存储库:

mystyle.sty
project/
    makefile
    project.tex

并且在 project.tex 的导言区中加入 \usepackage{mystyle}

当然,手动编译 project.tex 是行不通的,因为 mystyle.sty 不在与 project.tex 相同的目录中。

但是,如果 makefile 包含以下内容:

project.pdf: mystyle.sty project.tex
    pdflatex project

mystyle.sty: ../mystyle.sty
    cp ../$@ $@

然后在project目录中运行make命令将会导致在编译project.tex文件之前将mystyle.sty复制到正确的位置(这一次将会成功)。

这种方式可能看起来有点过度,但它结合了其他方法的最佳特点。

  1. 如果同一代码库中有多个项目需要mystyle.sty,那么在所有项目目录中都放一个通用的mystyle.sty比在每个项目目录中都复制一份更加合理;所有这些副本都必须维护。
  2. 编译是可移植的,因为假设你把mystyle.styproject.tex的拷贝给我,那么我(至少在理论上)能够手动编译而不需要修改你给我的文件。例如,我不必用\usepackage{/my/path/mystyle}替换\usepackage{/your/path/mystyle}

2
我会使用符号链接而不是直接复制文件。 - Radon Rosborough

3
您可以像上面建议的那样使用Makefiles。另一个选择是CMake。我没有测试父目录。
如果您有以下文件结构:
    ├── CMakeLists.txt
    ├── cmake
    │   └── UseLATEX.cmake
    ├── img
    │   └── logo.jpg
    ├── lib
    │   └── framed.sty
    └── main.tex
  • you should have CMake installed, instructions on CMake resources

  • UseLATEX.cmake can be downloaded from here

  • then inside the CMakeLists.txt

    ╚═$ cat CMakeLists.txt
    cmake_minimum_required (VERSION 2.6)
    set(PROJECT_NAME_STR myProject)
    project(${PROJECT_NAME_STR})
    
    set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
    include(UseLATEX)
    
    ADD_LATEX_DOCUMENT(main.tex
                       IMAGE_DIRS img
                       DEFAULT_PDF
                       MANGLE_TARGET_NAMES)
    
  • Some example content for main.tex (note the image)

    ╚═$ cat main.tex
    \documentclass{report}
    
    \begin{document}
    
    \begin{center}
      \includegraphics[width=300px]{img/logo.jpg}
    \end{center}
    
    \end{document}
    
  • The lib directory has the *.sty files

  • You can now compile:

    cd /directory/that/has/CMakeLists.txt/
    mkdir build
    cd build
    cmake ..
    make
    
  • you can then view main.pdf which is in the build directory.


我喜欢使用CMake,但是你的例子似乎不起作用,而且我也看不出来它怎么可能会起作用。在UseLATEX.cmake中没有出现字符串“lib”,也没有在你的帖子中的任何代码中出现。pdflatex如何知道那里是*.sty文件的位置? - cgmb
1
修复这个问题并不太难。我只是手动更改了 UseLATEX.cmake 中的样式复制代码,将文件从 ${CMAKE_CURRENT_SOURCE_DIR} 更改为 ${CMAKE_CURRENT_SOURCE_DIR}/lib - cgmb

3
当您使用使用kpathsea的TeX发行版时,您可以使用TEXINPUTS环境变量指定TeX查找文件的位置。变量需要按以下方式使用。 TEXINPUTS中的路径由:分隔。空路径将包括默认搜索路径,即只有冒号。两个连续的斜杠表示搜索目录及其所有子目录。
因此,例如,要构建使用当前目录中的文件、resources目录的所有子目录和默认目录的文件document.pdf,可以使用以下Makefile。
document.pdf: document.tex
    TEXINPUTS=.:./resources//: pdflatex document.tex

为了加快文件名查找速度,您可以使用 mktexlsr 命令构建一个 ls-R 数据库。
有关 kpathsea 的所有详细信息,请参阅 manual

2

您可以使用latexmk及其功能

在latexmk的Utility subroutines文档中,有一个特性记录在第48页上(链接),它可以在运行期间更新TEXINPUTS。如果您考虑使用.latexmkrc文件来配置您的链和选项,您可以将ensure_path()添加到该文件中:

以下是一个示例:

# .latexmkrc
ensure_path('TEXINPUTS', './path/to/something//', '/full/path/to/something/else//')
# [...] Other options goes here.
$pdf_update_method = 3;
$xelatex = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$pdf_previewer = 'start "%ProgramFiles%/SumatraPDF/SumatraPDF.exe" %O %S';
$out_dir = 'build/';

请注意,在路径末尾加上 //,这将帮助LaTeX在指定目录及其所有子目录中搜索文件。

请注意,虽然这是一个非常棒的功能,但您需要好好考虑命名方案。如果您在多个位置使用相同的文件名,并且使用 \include{somefile} 导入它们时可能会遇到麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接