在 TeX.SX 上,MiKTeX 的用户一次又一次地问起一个问题,他们遇到一个软件包或包含的程序的问题,结果发现,其中涉及一个 Perl 脚本,特别是glossaries
(因为脚本makeglossaries
)latexdiff
和latexmk
。在大多数情况下,错误消息如下所示:
makeglossaries.exe: The Perl interpreter could not be found.
如果我的记忆没错的话,它肯定可以在早期版本的 MiKTeX 中正常运行。
尽管除了特殊问题之外还有更多问题的答案,但我们能否在此提供一个基本的解决方案,即使它与 TeX 无关?
让我列出在撰写本文时 MiKTeX 中包含哪些 Perl 脚本(摘自 MiKTeX 配置文件scripts.ini
),每个脚本行在二进制子文件夹中都存在一个可执行文件,其名称在等号之前:
OOopict=脚本/gapfill/OOopict.pl afm2afm=脚本/fontools/perl/afm2afm.pl arlatex=脚本/bundledoc/arlatex 作者索引=scripts/perl/作者索引/authorindex.pl 自动安装=脚本/fontools/perl/自动安装.pl bib2xhtml=脚本/bib2xhtml/perl/bib2xhtml.pl bibhtml=脚本/bibhtml/perl/bibhtml.pl biokey2html1=scripts/shipunov/biokey2html1.pl biokey2html2=scripts/shipunov/biokey2html2.pl biokey2html3=scripts/shipunov/biokey2html3.pl birm=脚本/缅甸/perl/birm.pl bundledoc=脚本/bundledoc/bundledoc cmap2enc=脚本/fontools/perl/cmap2enc.pl csvtools=脚本/csvtools/perl/csvtools.pl ctanify=脚本/ctanify/ctanify ctanupload=脚本/ctanupload/ctanupload.pl dosepsbin=scripts/dosepsbin/dosepsbin.pl etexdef=脚本/texdef/perl/texdef.pl exceltex=脚本/exceltex/perl/exceltex feynmf=脚本/feynmf/perl/feynmf.pl fig4latex=脚本/fig4latex/perl/fig4latex.pl findhyph=脚本/findhyph/perl/findhyph.pl font2afm=scripts/fontools/perl/font2afm.pl fullref=scripts/aomart/perl/fullref.pl htcopy=脚本/tex4ht/htcopy.pl htmove=脚本/tex4ht/htmove.pl ibyhyph=scripts/perl/ibycus-babel/ibyhyph.pl latex-git-log=脚本/latex-git-log latexdef=scripts/texdef/perl/texdef.pl latexdiff-fast=脚本/latexdiff/latexdiff-fast latexdiff-so=脚本/latexdiff/latexdiff-so latexdiff-vc=脚本/latexdiff/latexdiff-vc latexdiff=脚本/latexdiff/latexdiff latexindent=脚本/latexindent/latexindent.pl latexmk=脚本/latexmk/perl/latexmk.pl latexand=脚本/latexand/latexand latexrevise=脚本/latexdiff/latexrevise ltximg=脚本/ltximg/ltximg.pl lualatexdef=脚本/texdef/perl/texdef.pl luatexdef=脚本/texdef/perl/texdef.pl makeglossaries=脚本/词汇表/makeglossaries makejmlrbook=脚本/jmlr/makejmlrbook mathspic113=脚本/mathspic/mathspic113.pl mathspic=脚本/mathspic/mathspic113.pl mf2pt1=脚本/mf2pt1/mf2pt1.pl mk4ht=脚本/tex4ht/mk4ht.pl mkjobtexmf=脚本/mkjobtexmf/mkjobtexmf.pl mkt1font=脚本/perl/accfonts/mkt1font.pl mptopdf=脚本/上下文/perl/mptopdf.pl orderrefs=scripts/perl/orderrefs/orderrefs.pl ot2kpx=脚本/fontools/perl/ot2kpx.pl pdfatfi=scripts/oberdiek/pdfatfi.pl pdfcrop=脚本/pdfcrop/pdfcrop.pl pdflatexdef=scripts/texdef/perl/texdef.pl pdftexdef=scripts/texdef/perl/texdef.pl 谱系=scripts/pedigree-perl/pedigree-perl/perl/pedigree.pl perltex=脚本/perltex/perl/perltex.pl pfm2kpx=脚本/fontools/perl/pfm2kpx.pl pkfix-helper=脚本/pkfix-helper/pkfix-helper pkfix=脚本/pkfix/pkfix.pl pn2pdf=scripts/perl/petri-nets/pn2pdf.pl pst2pdf=脚本/pst2pdf/perl/pst2pdf.pl rcsinfo=脚本/rcsinfo/perl/rcsinfo.pl showglyphs=scripts/fontools/perl/showglyphs.pl 拆分索引=脚本/拆分索引/perl/拆分索引.pl sty2dtx=脚本/sty2dtx/perl/sty2dtx.pl svn-multi=脚本/svn-multi/svn-multi.pl texcount=脚本/texcount/perl/texcount.pl texdef=脚本/texdef/perl/texdef.pl texdiff=脚本/texdiff/perl/texdiff.pl texdirflatten=脚本/texdirflatten/perl/texdirflatten.pl thumbpdf=脚本/thumbpdf/perl/thumbpdf.pl urlbst=脚本/urlbst/urlbst vpe=脚本/vpe/vpe.pl vpl2ovp=脚本/perl/accfonts/vpl2ovp.pl vpl2vpl=脚本/perl/accfonts/vpl2vpl.pl xdv2pdf_mergemarks=scripts/xetex/perl/xdv2pdf_mergemarks.pl xelatexdef=脚本/texdef/perl/texdef.pl xetexdef=脚本/texdef/perl/texdef.pl
列出的 Python 脚本很可能存在类似的问题:
pgfplots=脚本/pgfplots/pgfplots.py
PS:Lua脚本不受影响!
答案1
只有 MiKTeX 的开发者 Christian Schenk 才能给出明确的解决方案。我和大多数人一样,只是一个简单的用户,不具备阅读MiKTEX 来源。但根据经验,我猜他是故意删除了早期版本中包含的基本 Perl(正如问题中所说:我的记忆会欺骗我),所以他不必跟上最新情况。在这种情况下,真正的问题是,这似乎在官方 MiKTeX 文档或MiKTeX网站 (再次强调:我可能犯错)。
那么,该怎么办呢?
我将只描述 Perl 的方法,但对于 Python 来说也是类似的。下载概述适用于 Windows 的 Python。
答案是:自行安装完整的 Perl 发行版!
您可以在以下位置找到 Windows 版本的 Perl 发行版链接:Perl.org 下载页面。
如果你不知道选择哪一个,我建议你安装活动Perl由 ActiveState 提供。有一个“免费社区版”安装程序(在撰写本文时,请不要下载最新版本,而应下载推荐版本,因为否则您无法添加 perl 存储库进行模块更新)。默认情况下还会安装包管理器,以后可用于更新和配置。
对于高级用户,还有适用于 Windows 的 Strawberry Perl。稍后使用命令提示符终端完成配置。
两个安装程序都将 Perl 解释器添加到系统PATH
环境变量并将文件扩展名链接.pl
到解释器二进制文件perl.exe
,因此通常只需单击文件或在命令提示符中单独输入文件即可 - 但这不适用于没有扩展名的文件(但perl file
可以工作)。*)
我无法对提到的第三个发行版发表任何评论适用于 Windows 的 DWIM Perl,但由于据称是以草莓为基础的,所以它会非常相似。
*) (甚至可以更进一步将文件扩展名添加到系统变量中PATHEXT
,请参阅如何使我的 Perl 脚本像 Windows 上的普通程序一样运行?) 了解更多。
但是,当 Perl 安装完成后,仍然出现错误,该怎么办?
有时错误是由其他问题引起的。过去,几乎每次都是因为脚本路径发生了变化,但开发人员忘记调整 中的条目scripts.ini
。您无法编辑该文件,因为这会完全破坏功能!(该文件已签名。)但在这种情况下,你可以执行以下操作。我举latexdiff
个例子,这真的发生过。
确保您已经创建了本地根目录,参见在 MiKTeX 中创建本地 texmf 树。我们只需要 bin 子文件夹即可。您也可以使用其他文件夹。虽然它位于系统路径中,但请注意,必须找到它前MiKTeX 二进制文件夹。
启动您最喜欢的文本编辑器并粘贴以下几行。当然,调整安装路径,确切的脚本路径和名称您必须自己查看:
@echo off & setlocal :: Adjust path to MiKTeX root here, do not remove :: the double quotes, when you have spaces in path! :: By default in a 32-bit machine: :: set MiKTeXPath="C:\Program Files\MiKTeX 2.9" set MiKTeXPath="<Path-to-MiKTeX>" perl %MiKTeXPath%\scripts\latexdiff\latexdiff %*
最后一行会有所不同
texdef
:perl%MiKTeXPath%\scripts\texdef\perl\texdef.pl%*
您可以删除开头带有双冒号的行。
在上面第 1 项中提到的二进制文件夹中保存为文本文件,并使用等号前面的名称
scripts.ini
和文件扩展名.bat
(或者.cmd
如果您更喜欢这样),例如latexdiff.bat
。Windows 自己的记事本因.txt
自动添加扩展名而臭名昭著。当您使用双引号保存文件时,您可以避免这种情况:"latexdiff.bat"
。进行测试:打开命令提示符并输入
latexdiff --version
或latexdiff --help
。当您的 Perl 脚本没有输出时,您必须检查是否输入了正确的脚本路径和名称,并且包含批处理文件的二进制文件夹位于 MiKTeX bin 文件夹之前。省略了文件扩展名,因为实际调用也是在没有它的情况下进行的。您应该不时测试一下 MiKTeX 中的函数是否已修复。您可以通过明确输入
.exe
包装器版本来执行此操作:latexdiff.exe --version
。如果成功,您可以删除批处理文件。