为什么 LaTeX 无法在没有 sudo 权限的情况下打开包?

为什么 LaTeX 无法在没有 sudo 权限的情况下打开包?

你好,谢谢你来过,

我对 Ubuntu 还很陌生,在安装 LaTeX 时遇到了一些问题。

在我提出所有反对意见之前,先介绍一下背景知识:首先,安装和使用 LaTeX 比较容易,但是当我需要一个我的安装中没有的软件包时(IEEEtran,来自 texlive-publishers,我认为),就这样,我遇到了第一个大障碍。

经过几个小时的搜索和其他操作后,我终于让它工作了;只需拍一些 .tex 文件,sudo pdflatex saidFile.tex它就可以正常工作了。

然后我遇到了第二个大障碍:从 VScode 中尝试它。

所以我大部分时间都在 Windows 上工作,而我认为带有 Latex Workshop 扩展的 VScode 是人间天堂,它运行得很好,所以我试着让它在 Unix 上运行,结果……嗯,有些东西我不太理解或找不到,这就是我在这里的原因……对这一切感到抱歉。

所以问题是这样的:当我用 IEEEtran 编译文件时sudo,它工作正常;但是当我尝试从 VScode 或控制台编译它时没有sudo,它不起作用,它告诉我 LaTeX 找不到该包。

This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./labInform.tex
LaTeX2e <2020-02-02> patch level 5
L3 programming layer <2020-06-18>

! LaTeX Error: File `IEEEtran.cls' not found.

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: cls)

因此,我尝试以超级用户权限启动 VScode,但它告诉我这不正确,我可以理解为什么......有点。

所以是的...我不知道该做什么,也不知道在哪里搜索、搜索什么或如何做到这一点。

我对此深感抱歉,谢谢您。

答案1

您没有详细说明如何在系统上安装 TeX,因此很难诊断您的问题。

然而,你不应该跑步sudo latex 如果需要,则说明您的系统配置不正确。请texlive在您的系统上安装所需的软件包,或者进行自定义安装。 在 Ubuntu 上,这可以是texlive-publishers,或者直接安装texlive-full。如果你安装了 vanilla TeX Live 并使用tlmgr,它就在tlmgr包中IEEEtran。如果你使用 MikTeX ,它就在包中ieeetran

您应该能够使用 找到该文件kpsewhich IEEEtran.cls。如果此命令运行但找不到该文件,请确保其父目录可供所有人读取和执行(sudo chmod 755 /usr/local/texlive/2020/texmf-dist/tex/latex/IEEEtran/或它所在的任何位置)。如果该命令可以找到该文件但您无法使用 打开它more,请将其设置为所有人可读(sudo chmod 644 /usr/local/texlive/2020/texmf-dist/tex/latex/IEEEtran/IEEEtran.cls或它所在的任何位置)。如果您的 shell 找不到命令kpsewhich本身,请确保将包含 TeX 二进制文件的目录添加到您的PATH,并将文档添加到您的MANPATHINFOPATH。我在名为 的文件中拥有以下内容/etc/profile.d/texlive.sh

PATH=/usr/local/texlive/2020/bin/x86_64-linux:$PATH
export PATH
INFOPATH=/usr/local/texlive/2020/texmf-dist/doc/info:$INFOPATH
export INFOPATH
MANPATH=/usr/local/texlive/2020/texmf-dist/doc/man:$MANPATH
export MANPATH

如果您进行自定义安装,我建议创建一个用户tex(或者使用该bin帐户)并运行安装和更新命令,例如,

sudo -u tex -g tex $(which tlmgr) update --self --all

然后运行所有命令除了从您自己的帐户安装(只是latex,没有sudo),但是当您安装时,您只授予安装程序写入 TeX 安装的权限,而不是完全的 root 访问权限。

更新

既然 OP 已经发布了答案,我想跟进一下他们剩下的一些问题。

您不需要以 root 身份安装 TeX Live,尽管这样做也可以。您可能不想这样做的原因是安全性:如果您以 root 身份安装,则每个软件包安装脚本都会运行sudo root。您可以使用以下命令创建仅拥有 TeX 安装的新用户和组

sudo adduser --system --group --home-dir /usr/local/texlive tex

这将创建一个新的用户和组帐户,该帐户无法登录,并且仅拥有 TeX Live 目录。但是,您可以以 的身份运行命令sudo -u tex。此帐户的唯一目的是运行 TeX 安装程序和更新。这样,他们只有读取和修改您的 TeX 发行版的权限。

完成此操作后,您需要创建 tex 拥有的本地 TeX 树,并确保只有 TeX 可以在那里添加和删除文件,但其他所有人都可以使用cdls

sudo mkdir /usr/local/texlive
sudo chown tex:tex /usr/local/texlive
sudo chmod 755 /usr/local/texlive

(您描述chmod为生成文件。但它的作用是设置文件权限。我使用老式的八进制代码,因为我是 UNIX 老手。这里相关的是 755 表示每个人都可以读取和执行文件,但只有您可以写入它。)

如果你已经拥有此目录,你可以删除它并重新开始,或者直接使用以下命令将所有权移交给 tex

chown -R tex:tex /usr/local/share/texlive/

现在,您可以将 TeX Live(作为 tex)安装到 TeX 拥有的这个新目录中。从您解压 TeX Live 安装程序的目录中:

chmod 755 install-tl
sudo -u tex -E ./install-tl

选项-u tex表示以 tex 用户身份运行,-E表示保留环境变量,例如LANG确定语言。默认情况下,安装程序应将文件放在您刚创建的新目录中。/usr/local/texlive/由于 tex 拥有此目录,因此它可以。

还有一些设置要做。首先,您需要将 TeX Live 目录添加到您的PATHMANPATH环境INFOPATH变量中,位于系统目录之前。从上面重新发布:您可以将以下内容保存到名为 的文件中/etc/profile.d/texlive.sh,下次打开 shell 时它将加载。

PATH=/usr/local/texlive/2020/bin/x86_64-linux:$PATH
export PATH
INFOPATH=/usr/local/texlive/2020/texmf-dist/doc/info:$INFOPATH
export INFOPATH
MANPATH=/usr/local/texlive/2020/texmf-dist/doc/man:$MANPATH
export MANPATH

如果你exec bash -login重新加载你的环境,latex --version应该会给你pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020)。你还应该能够运行man latexinfo latex

更新 tex 安装的命令很长而且很烦人,但你可以创建一个容易记住的别名。编辑文件~/.profile并在末尾添加以下行:

alias update-tex=`sudo -u tex -E $(which tlmgr) update --self --all`

下次打开命令提示符(或使用 刷新exec bash -login)时,您可以通过键入 来更新update-tex

从 CTAN 安装非自由字体

如果你想安装,会遇到一些问题getnonfreefonts来自 CTAN。您可能想将其安装到您的用户目录中,因为这是唯一可行的方法。 您想以--sys而非 的身份进行安装--user。以用户身份安装 8 位字体是一个陷阱。 这需要一点技巧,但确实有效。如果您以用户身份安装,安装程序将以updmap用户身份运行,这将在您的用户目录中创建字体映射。这乍一看似乎有效,但它会向您隐藏系统映射,并且在您更新系统映射时不会更新,因此您的映射文件将越来越过时。

安装程序需要运行的命令是

sudo -u tex -E --preserve-env=PATH $(which texlua) install-getnonfreefonts

此命令创建一个 perl 脚本来安装字体,您可以使用它来运行

sudo -u tex -E --preserve-env=PATH /usr/local/texlive/2020/texmf-dist/scripts/getnonfreefonts/getnonfreefonts.pl --sys --all --refreshmap --http

安装其他本地文件

有时,您可能想要下载 TeX Live 软件包中没有的 TeX 文件,例如出版商的类文件或格鲁吉亚语的 Type 1 字体。通常,您需要将这些文件放在TEXMFLOCAL( /usr/local/texlive/texmf-local/) 的子目录中,而不是TEXMFHOME( ~/texmf/) 中。您可以使用 复制目录sudo -u tex cp -r。手动安装新文件后,运行

sudo -u tex -E $(which texhash)
sudo -u tex -E $(which updmap-sys)

这确保您的索引和地图文件是最新的。

如果您只需要它们用于一个项目,那么您可以将它们复制到您的项目目录中。

安装和使用字体

您可以将新字体保存到 来为您的用户帐户安装~/.fonts/,也可以将新字体保存到 来为所有人安装/usr/local/share/fonts/

您可能希望将 TeX 树添加到系统字体路径中。(或者甚至需要这样做,以便 XeTeX 能够始终找到它们。)执行此操作的文件是texlive-fontconfig.conf,您可以通过在目录中创建指向它的符号链接来启用它/etc/fonts/conf.d/

sudo ln -s /usr/local/texlive/2020/texmf-var/fonts/conf/texlive-fontconfig.conf /etc/fonts/conf.d/09-texlive2020.conf

我还创建了一个相同格式的文件来索引我的 TEXMFLOCAL 树中的字体。我将以下内容保存为/etc/fonts/conf.d/09-texmf-local.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/texmf-local/fonts/opentype</dir>
  <dir>/usr/local/texlive/texmf-local/fonts/type1</dir>
  <dir>/usr/local/texlive/texmf-local/fonts/truetype</dir>    
</fontconfig>

我给这些文件指定了一个较小的数字,例如09,这样它们将在系统目录之前被搜索。我的 TeX 目录中的字体通常更为最新。

XeTeX 和 LuaTeX 都会在你下次请求它不认识的字体时自动刷新数据库,但你可以手动让它们这样做

sudo fc-cache -fsv
luaotfload-tool --update --local --prefer-texmf

其他可选内容

有些人建议制作一个虚拟apt包,以防止自动安装第二个版本texlive。我个人没有遇到过这个问题。

答案2

好吧,对于遇到类似问题的人来说,我有一个很棒的答案。非常感谢@Davislor 之前的回答和帮助。我正在使用 Ubuntu 20.04。

我将尝试划分问题,因为所有帮助过我的东西都在不同的网站上,针对不同的问题,我将尝试给出所有参考资料以及页面和用户的功劳。

我认为这不属于原始问题,或者它属于...我不知道,也许这是一种安装指南......但我开始了。

我从清除和卸载我拥有的 LaTeX 开始,所以这是从头开始......


安装 LaTeX

对于安装,我只需按照最多官方安装,但它没有对 Linux(在本例中为 Ubuntu)进行太多阐述;我tl-unx.tar.gz从官方网站下载了,这里unzip并使用 生成 Perl 脚本chmod,如下所示:

chmod +x install-tl

然后,我以超级用户的身份启动了该脚本,尽管官方页面上是这样说的:

官方安装

我认为这可能是一个问题,但除此之外,脚本无法安装 LaTeX,正如页面所建议的那样,我也不太清楚如何以其他方式安装。我做了一些其他重要的事情......我不知道这是好事还是坏事,我遵循了@Andrew Stacey 关于的评论umask,你可以看到评论这里

然后,我只是按照脚本说明进行操作,但我选择的软件包使我的 LaTeX 安装重量约为 1.6GB,因此它是一个“自定义”安装。

所以这里...我认为如果您使用其他配置或其他东西,LaTeX 已完全安装。由你决定。

有些东西非常,非常重要的是正确设置 LaTeX 的 PATH 变量,官方安装指南会告诉你如何操作。如果你以后想独立安装软件包,这会派上用场。


安装单个软件包

安装后,我认为一切都正常,我尝试在没有超级用户权限的情况下编译我想要的文件(带有 的文件\documentclass[conference]{IEEEtran}),正如@Davislor 所说,一切都成功了!或者说,现在的问题不同了,它向我展示了另一个问题,这个问题困扰了我一段时间;它没有找到包float.sty

我不太明白这一点,但是当我安装 LaTeX 时说明,一切似乎都运行正常,但我发现一个大问题:这个问题。我以为更新 PATH 变量会起作用,但是没有。

我有点担心自己遇到了与该float.sty软件包相同的问题,但我还是尝试了一下,并且该实用程序解决了问题tlmgr。但是,又出现了另一个问题;从 tlmgr 安装包时出现权限问题

按照说明发布和这个,帮我解决了所有问题。所以现在我可以安装任何包,如下所示:

sudo env PATH="$PATH" tlmgr install <name of package>

VScode 运行良好。


最后,我为我所有的指责感到抱歉,并感谢@Davislor鼓励我跳进这个兔子洞。我希望这能帮助任何遇到与我相同问题的人。

相关内容