确定 Ubuntu 中已安装的 LaTeX 软件包的完整列表

确定 Ubuntu 中已安装的 LaTeX 软件包的完整列表

我是新手,刚刚继承了一份用 LaTeX 编写的大型文档(超过 250 页),前一位作者离开了公司。有没有简单的方法可以确定全部我的系统上安装了哪些 LaTeX 软件包?我使用 Ubuntu 12.10 作为工作站,并且在最初尝试使用 LaTeX 时安装了 texlive-full 和其他几个软件包。

我从 .tex 文件中获得了项目使用的包列表,所以我知道哪个我需要的软件包。但似乎我的系统上有多个地方安装了软件包,所以我无法确定所需的软件包是否都在那里。是否可以获取全部安装了 LaTeX 软件包?或者甚至列出软件包存储的所有位置就足够了。似乎我的系统中有多个位置安装了软件包,所以我不能简单地查看 texmf 文件夹下的内容。

在我开始安装 CTAN 的附加软件包之前,我真的想确保我没有重复任何一个……

抱歉,我肯定这个问题很愚蠢,但我在网上找了好久都没找到答案。非常感谢您的帮助,让我保持理智。:)

谢谢,-Colin

答案1

你可以找到 TeX 将使用以下方式搜索文件的所有位置

kpsepath tex

格式有点奇怪:项目以冒号分隔,使用ls-R索引文件搜索的目录以 开头!!,要递归搜索的目录以 结尾//。为了清理它,我们可以对输出进行一些处理:

kpsepath tex | tr ':' '\n' | perl -ne 'm-^(!!)?(/.*?)(//)?$- && print "$2\n"'

对于每个路径,您可以使用以下命令找出哪些已安装的软件包已将文件放在这些路径下dlocate

dlocate --package-only /path

(如果您没有 dlocate,请安装它并确保运行sudo update-dlocatedb)。将所有内容放在一起并从输出中删除重复的软件包名称:

kpsepath tex | tr ':' '\n' | perl -ne 'm-^(!!)?(/.*?)(//)?$- && print "$2\n"' | while read path; do dlocate --package-only $path ; done | sort -u

例如,在我的系统上,打印:

asymptote
cm-super-minimal
context
dblatex
feynmf
gnuplot-x11
latex-beamer
latex-cjk-common
latex-make
latex-xcolor
latex2html
lgrind
lilypond-data
lmodern
pgf
preview-latex-style
tex-common
tex-gyre
tex4ht-common
texinfo
texlive-base
texlive-bibtex-extra
texlive-extra-utils
texlive-font-utils
texlive-fonts-extra
texlive-fonts-recommended
texlive-generic-recommended
texlive-lang-other
texlive-latex-base
texlive-latex-extra
texlive-latex-recommended
texlive-luatex
texlive-math-extra
texlive-metapost
texlive-pictures
texlive-pstricks
texlive-science
texlive-xetex
texpower
tipa

那里有些东西我没想到,比如gnuplot-x11,但dpkg -L显示它包含gnuplot-lua-tikz.sty。谁知道?!

答案2

我非常不愿意安装 Linux 发行版官方软件包中没有的任何东西,但 LaTeX 和 R 是例外,这证实了我的规则。

由于 Ubuntu 中 LaTeX 的软件包可能已经过时,Ubuntu 软件包列表不是 LaTeX 软件包列表,并且并非所有 TeX Live 内容都可以从.deb软件包中获得(尤其是tlmgr),我认为控制已安装内容的最佳方法是:

  1. 卸载所有.deb与 LaTeX 相关的软件包。
  2. 按照以下说明安装最新的 TeX Live 2013www.tug.org
  3. 然后,您可以轻松获得以下列表: tlmgr list | more以及特定包的详细信息(例如tlmgr info xcolor:)

我不认为获得该列表证明下载几千兆字节并更改安装是合理的,但它是一个很好的借口,tlmgr以便您可以更新和安装全部您需要的最新 TeX Live 包。

答案3

使用unix工具:

按用户搜索包:

find ~ -name '*.sty' | grep -oE '/([^/]+)/[^/]+\.sty$' | cut -f2 -d'/' | sort | uniq

要搜索系统范围的软件包:

find /usr -name '*.sty' | grep -oE '/([^/]+)/[^/]+\.sty$' | cut -f2 -d'/' | sort | uniq

搜索所有文件系统:

sh -c "find / -name '*.sty' | grep -oE '/([^/]+)/[^/]+\.sty$' | cut -f2 -d'/' | sort | uniq" 2>/dev/null

2>/dev/null是为了抑制“许可被拒绝错误”

答案4

另一种方法是

kpsepath tex | tr ':' '\n' | perl -ne 'm-^(!!)?(/.*?)(//)?$- && print "$2\n"' |xargs -J % find % -name '*.sty' | grep -oE '/([^/]+)/[^/]+\.sty$' | cut -f2 -d'/' | sort | uniq

这是结合 Ilya 和 Jim 的回答得出的结论,只不过它可以防止搜索整个目录结构,而且它不需要dlocate(仅仅find)。

相关内容