makeindex 和受限 \write18

makeindex 和受限 \write18

我使用该nomenclature软件包为我的论文创建命名法部分。我已经有一段时间没有用命名法写论文了,但今天它不起作用。

为了使用该nomenclature包,我需要运行makeindex并重新运行我的 LaTeX 文件。我通常在 LaTeX 文件的第一行写以下内容,一切都会自动正常运行。

\immediate\write18{makeindex "paper".nlo -s nomencl.ist -o "paper".nls}

但今天它却无法正常工作。问题似乎\write18是受限模式。自从我上次撰写了一篇包含命名法部分的论文以来,TeX Live 可能发生了一些变化,当时我升级了操作系统。

我可以用bibtex运行\write18。有什么原因为什么makeindex不能运行?我认为它应该是一个安全的程序。

如果我使用 运行--shell-escape,一切都会正常工作,但我不想这样做,因为限制模式是出于某种原因而创建的。我也可以makeindex在 bash shell 中手动运行该命令,一切都会正常工作,但我使用的是 kile,不想一直运行另一个命令。

我可以创建的最简单的示例文件:

\immediate\write18{makeindex "paper".nlo -s nomencl.ist -o "paper".nls}
\documentclass[11pt]{article}
\usepackage{nomencl}
\makenomenclature
\begin{document}
    \printnomenclature
    some text
    \nomenclature{$symbol$}{description}
\end{document}

运行pdflatex paper.tex不会产生命名法。运行pdflatex --shell-escape paper.tex会产生命名法。测试时,请确保在运行后删除目录中的所有额外文件--shell-escape或更改符号名称,因为您可能认为问题已解决,而实际上该makeindex命令只是在上一次测试中运行的。

如何查看在受限模式下允许哪些命令?如果我kpsewhich --var-value shell_escape_commands在 bash 中运行,它会返回“bibtex,bibtex8,kpsewhich,makeindex,mpost,repstopdf,”。因此,makeindex 似乎应该可以工作。

pdflatex我在 Ubuntu 13.04 上使用。

答案1

如果我运行这个例子,我得到

runsystem(makeindex "donom".nlo -s nomencl.ist -o "donom".nls)...quotation error in system command.

在日志文件中;在 Mac OS X 上使用 MacTeX/TeX Live 2014 和在 Debian 系统上使用 TeX Live/Debian 2013 进行了测试。

另一方面,如果我将这一行改成

\immediate\write18{makeindex "\jobname.nlo" -s nomencl.ist -o "\jobname.nls"}

然后命令就会被执行。

请注意,使用\jobname而不是实际文件名可以重复使用代码。另外,我会使用

\immediate\write18{makeindex -s nomencl.ist -o "\jobname.nls" "\jobname.nlo"}

因为这是一种更常见的语法(但是makeindex在文件名后也接受选项)。

还有一种不同的策略,即使用arara

% arara: nomencl
% arara: pdflatex

\documentclass[11pt]{article}
\usepackage{nomencl}
\makenomenclature
\begin{document}
    \printnomenclature
    some text
    \nomenclature{$symbol$}{description}
\end{document}

如果你运行命令行

arara -v <filename>

您将获得同样的效果。

答案2

看起来不寻常的文件名引号(即“paper”.nlo 和“paper”.nls)已成为受限 \write18 的问题。我不知道为什么我过去会使用它,但一定是与 makeindex 相关的一些怪癖需要它。这个怪癖现在似乎已经修复了。所以,如果我更改为

\immediate\write18{makeindex paper.nlo -s nomencl.ist -o paper.nls}

一切按预期进行。

相关内容