在main * .tex文件的超级/子目录中包含* .sty文件

时间:2011-05-13 15:10:07

标签: latex

我想通过git与许多其他人分享一份乳胶文件。 因此,我们决定将所有在everyones latex-installation中不存在的特殊样式文件放入资源目录中。如果这个目录是一个超级目标,那将是很酷的。实际的工作目录 我究竟如何导入这些样式文件?

重要的是,即使这些远程样式的依赖关系也可以通过其他远程样式解决。

5 个答案:

答案 0 :(得分:17)

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

  1. 如果您在路径中或与.tex文件位于同一文件夹中,只需在序言中加入此行:\usepackage{mystyle}
  2. 如果您将其保存在其他文件夹中,则可以使用\usepackage{/path/to/folder/mystyle}
  3. 的完整路径进行访问

    也就是说,如果您不确定风格文件是否在每个人的安装中,只需将其包含在同一目录中,并确保执行git add mystyle.sty并跟踪它其余的文件(尽管很可能不会对其进行任何更改)。不需要父目录。但如果您坚持使用其他目录,请参阅上面的选项2.

    如果它位于子目录而不是父目录中会更好,因为您仍然可以将文件称为\usepackage{subdir/mystyle}并确保您正在调用样式文件。但是,如果您转义到父目录,您永远不会知道其他用户是否具有类似命名的文件夹,该文件夹不属于您的程序包,这可能会导致错误。

答案 1 :(得分:7)

这可能与你无关,但这是另一种做你想做的事情。 像这样设置你的git存储库:

mystyle.sty
project/
    makefile
    project.tex

并将\usepackage{mystyle}放在project.tex的序言中。 当然,手动编译project.tex将不起作用,因为mystyle.styproject.tex不在同一目录中。

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

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

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

然后从make目录中运行project将导致mystyle.sty被复制到project.tex(此次成功)编译之前的正确位置。

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

  1. 如果同一个存储库中的多个项目需要mystyle.sty,那么在它们上面放置一个共同的mystyle.sty比在每个项目目录中都有一个副本更有意义;所有这些副本都必须保留。
  2. 编译是可移植的,在某种意义上说,如果你给了我mystyle.styproject.tex的副本,那么我(理论上至少)可以手动编译而无需修改文件你给我。 例如,我不必将\usepackage{/your/path/mystyle}替换为\usepackage{/my/path/mystyle}

答案 2 :(得分:3)

您可以按照上面的建议使用Makefile。另一种选择是CMake。我没有测试父目录。

如果您有以下文件结构:

    ├── CMakeLists.txt
    ├── cmake
    │   └── UseLATEX.cmake
    ├── img
    │   └── logo.jpg
    ├── lib
    │   └── framed.sty
    └── main.tex
  • 您应该安装CMake,有关CMake resources

  • 的说明
  • 可以从here

  • 下载UseLATEX.cmake
  • 然后在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)
    
  • main.tex的一些示例内容(请注意图像)

    ╚═$ cat main.tex
    \documentclass{report}
    
    \begin{document}
    
    \begin{center}
      \includegraphics[width=300px]{img/logo.jpg}
    \end{center}
    
    \end{document}
    
  • lib目录包含* .sty文件

  • 您现在可以编译:

    cd /directory/that/has/CMakeLists.txt/
    mkdir build
    cd build
    cmake ..
    make
    
  • 然后您可以查看构建目录中的main.pdf。

答案 3 :(得分:0)

使用使用kpathsea的TeX发行版时,可以使用TEXINPUTS环境变量来指定TeX在哪里寻找文件。该变量需要按以下方式使用。

TEXINPUTS中的路径由:分隔。空路径将包括默认搜索路径,即仅冒号。连续两个斜杠表示搜索目录和所有子目录。

因此,例如,要构建使用当前目录中的文件,document.pdf目录的所有子目录以及默认目录的文件resources,可以使用以下Makefile。

document.pdf: document.tex
    TEXINPUTS=.:./resources//: pdflatex document.tex

要加快文件名查找的速度,可以使用ls-R命令建立一个mktexlsr数据库。

有关kpathsea的所有详细信息,请查看manual

答案 4 :(得分:0)

您可以使用latexmk及其功能

latexmk中的第48页 hereUtility subroutines下记录了一项功能,该功能可以在运行期间更新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}进行导入时会遇到麻烦。