我一直在使用 TeX Live 2018 并在其中安装了一些软件包,现在 2019 已经发布,我需要安装新版本(Windows)。出于正常原因,我正在使用基础方案安装选项(plain
和latex
)。是否可以将安装在我电脑上的 2018 软件包导入到 2019?或者我不知道,再次安装它们但不手动创建列表或类似的东西?
另一个子问题是是否可以将软件包复制到另一台计算机,或者复制这些软件包的列表,然后在另一台计算机上单击它并一次性安装它们。
答案1
我按照如下方式解决了这个问题:安装新的发行版后(现在都已安装)
- 打开旧的 Tex Live 命令行并输入
tlmgr list --only-installed > old.txt
。 - 打开新的 Tex Live 命令行并输入
tlmgr list --only-installed > new.txt
。
现在将这两个文件复制到同一个文件夹中,然后我在 MATLAB 中编写了一个小脚本,它很简单,也可能用任何其他语言编写,如下所示:
oldfile=fopen('old.txt');
oldtext=fread(oldfile,'*char')';
fclose(oldfile);
oldpackages=regexp(oldtext,'(?<=i )[\w\.\-]+(?=:)','match')';
clear oldfile oldtext
newfile=fopen('new.txt');
newtext=fread(newfile,'*char')';
fclose(newfile);
newpackages=regexp(newtext,'(?<=i )[\w\.\-]+(?=:)','match')';
clear newfile newtext
packagestoadd=strjoin(oldpackages(~ismember(oldpackages,newpackages)));
clear newpackages oldpackages
该packagestoadd
变量现在包含所有安装在旧发行版但未安装在新发行版上的软件包的名称。
- 现在再次转到新的 TeX Live 命令行(如果它安装在文件夹中,则必须以管理员身份打开它
Programm files
),tlmgr install
在此命令之后立即键入并复制提到的变量中的字符串。
编辑:我用 C++ 编写了这个脚本并对其进行了编译,代码如下:
#include <set>
#include <regex>
#include <fstream>
using namespace std;
int main()
{
regex re("^i ([\\w\\.\\-]+):");
smatch match;
string line;
ifstream newFile("new.txt");
set<string> newPackages;
while (getline(newFile, line))
{
regex_search(line, match, re);
newPackages.insert(match.str(1));
}
newFile.close();
ifstream oldFile("old.txt");
ofstream file("toadd.txt");
while (getline(oldFile, line))
{
regex_search(line, match, re);
if (newPackages.find(match.str(1)) == newPackages.end())
{
file << match.str(1) << endl;
}
}
oldFile.close();
file.close();
}
我还为 Windows x64 编译了它,您无需其他软件即可使用它。还有一个批处理文件,可以自动安装 TeX Live 包。我将其上传到这里:C++ 可执行文件。要使用它,只需下载,将其放在 PC 上的任何文件夹中,然后让 TeX Live 命令行创建 2 个文本文件(必须命名为old.txt
和new.txt
)并将它们放入与 2 个下载文件相同的文件夹中。然后只需双击 bat 文件即可。
如果您将 TeX Live 安装在Programm Files
需要承认权限的文件夹中,则需要以cmd
管理员身份运行或 TeX Live 命令行,导航到您复制文件的文件夹(使用cd
命令),然后输入 import texlive packages.bat
。
如果您只是想知道差异,您可以双击 exe 文件,它只会创建一个包含缺失包的新文本文件new.txt
。