我还不太确定这是错误还是配置问题。如果我能从其他人那里得到确认这是一个问题,我会提交错误报告。
我安装了最近更新的版本texosquery
(v 1.2.1)。一切就绪后,我发现texosquery
从命令行运行没有问题,通过\write18
打印到日志/控制台运行也没有问题。因此,我知道该--shell-escape
选项有效。
当我实际尝试在 XeLaTeX 或 XeTeX 中使用时,问题就出现了texosquery
。pdfLaTeX 似乎工作正常,但我认为在这种情况下它默认使用 \pdf... 原语。
系统详细信息:
- Windows 10
- MiKTeX 2.9.6210 64 位
- texosquery 1.2.1
- MiKTeX-XeTeX 2.9.6216 (0.99996)
- (如果有任何重要信息请告知我)
无论是否经过调试,\TeXOSQuery
XeLaTeX 生成的 PDF 中返回的所有宏都是空的/空白的。
例如,\TeXOSQuery{\result}{--debug --locale}\result
我可以通过日志/控制台看到输出\write18
,但它并没有进入 PDF。
一位 MWE 表示:
% arara: xelatex: {shell: on}
\documentclass{article}
\usepackage{texosquery}
\usepackage{etoolbox}
\begin{document}
%returns correct details and log/console output:
%\pdfd \fcln 20170330184224\fpls 11\fapo 00\fapo
\immediate\write18{texosquery-jre8 --debug --pdfnow}
%empty output
\TeXOSQuery{\result}{--debug --pdfnow}\result
%prints "HERE IS RESULT: " to log/console
\immediate\write18{echo HERE IS RESULT: \result}
%no PDF is created after successful compilation
\end{document}
通过 ( 进行编译miktex-xelatex
并xelatex
给出相同的结果):
miktex-xelatex.exe -enable-enctex -enable-etex -enable-mltex -enable-pipes -enable-write18 -synctex=1 --shell-escape "test-xeltx2.tex"
我不确定如何解决该问题。我希望找出安装问题、配置问题或错误。如果是错误,是否有可能找到解决方法?
编辑:忘记包含 MiKTeX 和的配置信息texosquery
。
在 中texapp.ini
,相关信息:
EnableWrite18=p
;; Commands allowed via partially enabled \write18{...}.
AllowedShellCommands=
AllowedShellCommands;=bibtex
AllowedShellCommands;=bibtex8
AllowedShellCommands;=epstopdf
AllowedShellCommands;=extractbb
AllowedShellCommands;=findtexmf
AllowedShellCommands;=kpsewhich
AllowedShellCommands;=makeindex
AllowedShellCommands;=mpost
AllowedShellCommands;=texosquery
AllowedShellCommands;=texosquery-jre5
AllowedShellCommands;=texosquery-jre8
并且texosquery.cfg
:
\def\TeXOSInvokerName{texosquery-jre8}
\TeXOSQueryAllowRestricted
希望有帮助!
EDIT2:我把两个不同的问题混为一谈了。我将错误/权限问题移到这里,并将非错误问题保留在上面。此错误也发生在命令行中,因此它似乎与 XeLaTeX 无关,而是与 MiKTeX 权限有关(我想?)。
打开调试,例如texosquery --debug --cwd
我收到以下错误(为保护隐私而编辑的路径):
texosquery-jre8: Can't determine openin value, assuming 'p'
texosquery-jre8: "kpsewhich '-var-value=openin_any'" failed with exit code: 1
java.io.IOException: "kpsewhich '-var-value=openin_any'" failed with exit code: 1
at com.dickimawbooks.texosquery.TeXOSQuery.kpsewhich(TeXOSQuery.java:135)
at com.dickimawbooks.texosquery.TeXOSQuery.isReadPermitted(TeXOSQuery.java:312)
at com.dickimawbooks.texosquery.TeXOSQuery.getCwd(TeXOSQuery.java:960)
at com.dickimawbooks.texosquery.TeXOSQuery$2.action(TeXOSQuery.java:4033)
at com.dickimawbooks.texosquery.QueryAction.doAction(QueryAction.java:367)
at com.dickimawbooks.texosquery.TeXOSQuery.processArgs(TeXOSQuery.java:4002)
at com.dickimawbooks.texosquery.TeXOSQueryJRE8.main(TeXOSQueryJRE8.java:369)
texosquery-jre8: Read access forbidden by openin_any=p (has absolute path outside TEXMFOUTPUT): C:\PATH\tests
texosquery-jre8: Read access not permitted for the current directory
这里似乎有两个问题。首先,MiKTeX 没有使用texmf.cnf
,这在其他安装中很常见。如果查看文件内容,这可能不是问题kpsewhich
……除非我用.ini
MiKTeX 文件中的变量(默认值:C:\Program Files\MiKTeX 2.9\miktex\config)以及文件名进行了测试。 kpsewhich
似乎不允许在该文件夹中使用,即使具有查看/读取权限(或者我做错了)。
只是为了好玩,我texmf.cnf
用以下行创建了一个openin_any=a
。我将其放在安装(管理员)配置文件夹、本地(用户)配置文件夹以及安装(管理员)根文件夹中。为了安全起见,我每次都会刷新管理员和用户的 FNDB。行为没有改变。
kpsewhich -var-value=openin_any
在命令行中运行时,没有任何变化。如果我将openin_any
值添加到本地用户变量,该值会随命令一起显示。但是,这个变量/值似乎仍然无法通过-a
识别。texosquery
kpsewhich
答案1
MiKTeX 有一个不同的 kpathsea/kpsewhich 实现,并且 openin_any 没有在那里定义。但您可以将变量添加为环境变量。这帮我解决了 kpsewhich 错误:
C:\Users\XXX\Documents\tests>set openin_any=a
C:\Users\XXX\Documents\tests>pdflatex --shell-escape --enable-pipes test-utf8
由于 miktextexorquery.exe
的 bin 文件夹中有一个,因此我从您的示例中删除了 jre8 引用。我没有更改或添加任何配置文件,而只是使用了从 miktex NEXT 获得的状态。我确实有 java 1.8,这似乎是 texorquery 的默认设置。
\documentclass{article}
\usepackage{texosquery}
\usepackage{etoolbox}
\begin{document}
%returns correct details and outputs to log/console
\immediate\write18{texosquery --debug --pdfnow}
%empty output, produces the error above via log/console - but doesn't halt compilation
\TeXOSQuery{\result}{--debug --cwd}\result
%prints "HERE IS RESULT: " to log/console
\immediate\write18{echo HERE IS RESULT: \result}
\end{document}
遗憾的是,这并没有解决第二个问题:miktex 似乎无法正确处理管道中带有参数的命令。从这样的文档中可以看出这一点(使用 xelatex 或 pdflatex --enable-pipes 进行编译):
\documentclass{article}
\begin{document}
\makeatletter
\@@input|"kpsewhich --help"
% \@@input|"dir" %works
\end{document}
我针对此问题提交了一个错误报告:https://sourceforge.net/p/miktex/bugs/2589/
通过lualatex --shell-escape
您的示例可以很好地进行编译(不需要 --enable-pipes)。