如何适当配置 latexmkrc 中的 TEXINPUTS 变量以检测项目目录中自定义文件夹中存在的 sty 和 cls 文件?

如何适当配置 latexmkrc 中的 TEXINPUTS 变量以检测项目目录中自定义文件夹中存在的 sty 和 cls 文件?

我正在开发一个项目,其中TeX 发行版安装的.cls和文件太旧了,但它们已被 上的其他用户修补。我希望将这些和文件的更新版本用于我的项目。出于各种个人原因(易于跨计算机移植),我不想使用树,而希望将它们放在我的项目目录根目录中的文件夹中。.stygithub.cls.stytexmf-localcustom_cls_sty_files

我将latexmk其用作构建工具。按照建议的解决方案这里,我尝试配置我latexmkrc

$ENV{'TEXINPUTS'}='./custom_cls_sty_files//:' . $ENV{'TEXINPUTS'};

然而,这破坏了一切。latexmk不仅无法找到.sty.cls文件,甚至找不到main.tex

以下mwemain.tex

\documentclass{article}
\usepackage{setspace}
\usepackage{blindtext}

\begin{document}
    \doublespacing
    \blinddocument
\end{document}

的本地副本setspace.sty位于文件夹中custom_cls_sty_files

目前,我在 TL 2018 上的 Windows 10 机器上遇到了这个问题。但我mac家里有一台笔记本电脑,linux办公室有一台机器,我通过 git/github 组合处理这个项目。因此,我想要一个可以解决这个问题的跨平台latexmkrc文件(即假设这个问题首先是由于操作系统差异而引起的)

尝试建议的解决方案时出现错误消息

Use of uninitialized value in concatenation (.) or string at (eval 17) line 59, <GEN0> chunk 1.
Latexmk: This is Latexmk, John Collins, 25 October 2018, version: 4.61.
Latexmk: applying rule 'lualatex'...
Rule 'lualatex': Rules & subrules not known to be previously run:
   lualatex
Rule 'lualatex': The following rules & subrules became out-of-date:
      'lualatex'
------------
Run number 1 of rule 'lualatex'
------------
------------
Running 'lualatex  -recorder  "main.tex"'
------------
This is LuaTeX, Version 1.07.0 (TeX Live 2018/W32TeX)
 restricted system commands enabled.
! I can't find file `main.tex'.
<*> main.tex

(Press Enter to retry, or Control-Z to exit)
Please type another input file name:

答案1

Latexmk 实际上有一个子程序用于将项目添加到搜索路径。您可以编写

ensure_path( 'TEXINPUTS', './custom_cls_sty_files//' );

这负责在变量中的项之间使用正确的操作系统相关分隔符。它还可以优雅地处理搜索路径变量不存在的情况。

这个子程序还没有记录,但它将在下一个版本中出现。

Ensure_path 的文档

ensure_path( var, values ...)

第一个参数是系统用于搜索路径的环境变量之一的名称。其余参数是变量中应有的值。对于每个值参数,如果它尚未在变量中,则将其添加到变量的前面;在这种情况下,如果环境变量尚不存在,则创建它。对于分隔值,使用适合操作系统的字符——请参阅配置变量 $search_path_separator

例子:

ensure_path( 'TEXINPUTS', './custom_cls_sty_files//' );

(在此示例中,TeX 系统记录了尾随的//意思是 latex、pdflatex 等在指定目录及其所有子目录中搜索文件。)

从技术上讲,ensure_path通过设置 Perl 的变量 来实现 $ENV{var},其中var是目标变量的名称。更改的值随后作为环境变量传递给任何调用的程序。

答案2

较新版本的 Tex Live 解决了以下需求用户或项目特定文件集以覆盖默认值。这仅适用于优先考虑那里的文件,texmf 路径上的其他文件将照常使用。虽然未经测试,但我不会在两个位置之间拆分 TDS 包,因此在某些情况下您可能需要复制与包相关的支持文件,以便彼此相对找到。

这是在 Tex Live 2017 中引入的,通过调用来调用(与平台无关)

 tlmgr conf auxtrees [add | remove | show] <path to desired files>

对于窗口的使用可能类似于(避免空格和重音等)

tlmgr conf auxtrees 添加 C:\Users\myname\PersonalTexmf
tlmgr conf auxtrees 显示 C:\Users\myname\PersonalTexmf

Linux 或 OS/X 用户可能需要使用 sudo:

sudo tlmgr conf auxtrees 添加“./personal_texmf”

您可能需要尝试使用符合 TDS 的文件夹,但相关结构应该与 texmf-local 中的类似。
另请参阅https://www.tug.org/texlive/doc/texlive-en/texlive-en.html#x1-110002.3

辅助树很重要不在现有的 texmf 中结构(以避免潜在的优先权冲突),然而辅助可能是 texmf-local 旁边的一个文件夹

如果 texmf-local 文件干扰优先级,则可能需要先通过 shell 脚本暂时阻止默认的 texmf-local 文件夹,或通过当前 texmf.cnf 的替代副本手动注释掉

以下是 2017 年博客中的一个假设示例会话

$ tlmgr conf auxtrees show
tlmgr: no auxiliary texmf trees defined.
$ tlmgr conf auxtrees add /projects/book-abc
$ tlmgr conf auxtrees
List of auxiliary texmf trees:
  /projects/book-abc
$ tlmgr conf auxtrees remove /projects/book-abc
$ tlmgr conf auxtrees show
tlmgr: no auxiliary texmf trees defined.

这是非常不典型的,在愤怒地致电 Tex Live 之前,我们可能需要为用户解决文件名数据库/字体映射问题。

请注意,与此同时

“现在,会先搜索 TEXMFLOCAL 树,然后再搜索 TEXMFSYSCONFIG 和 TEXMFSYSVAR(默认);”

默认值应为

“TEXMFLOCAL(默认情况下,Windows 上的 /usr/local/texlive/texmf-local 或 %SystemDrive%\texlive\texmf-local)用于系统范围的本地字体和宏;而 TEXMFHOME(默认情况下,$HOME/texmf 或 %USERPROFILE%\texmf)用于个人字体和宏。这些目录旨在从一个版本到另一个版本保留,并让新 TEX Live 版本自动显示其内容。因此,最好不要将 TEXMFLOCAL 的定义更改为离主 TEX Live 目录太远,否则您将需要手动更改未来的版本。”

使用 Kpathsea 和 Kpsewhich 查看结果可能会有用
https://www.tug.org/texlive/doc/texlive-en/texlive-en.html#x1-550007.1
https://www.tug.org/texlive/doc/texlive-en/texlive-en.html#x1-650007.2.2

因此在向优先级顺序添加或删除路径后,我们还应该调用

mktexlsr   

或者可能更好

texhash  

相关内容