我正在开发一个项目,其中TeX 发行版安装的.cls
和文件太旧了,但它们已被 上的其他用户修补。我希望将这些和文件的更新版本用于我的项目。出于各种个人原因(易于跨计算机移植),我不想使用树,而希望将它们放在我的项目目录根目录中的文件夹中。.sty
github
.cls
.sty
texmf-local
custom_cls_sty_files
我将latexmk
其用作构建工具。按照建议的解决方案这里,我尝试配置我latexmkrc
的
$ENV{'TEXINPUTS'}='./custom_cls_sty_files//:' . $ENV{'TEXINPUTS'};
然而,这破坏了一切。latexmk
不仅无法找到.sty
和.cls
文件,甚至找不到main.tex
!
以下mwe
是main.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