texosquery 无法与使用 XeLaTeX 的 MiKTeX 很好地兼容

texosquery 无法与使用 XeLaTeX 的 MiKTeX 很好地兼容

我还不太确定这是错误还是配置问题。如果我能从其他人那里得到确认这是一个问题,我会提交错误报告。

我安装了最近更新的版本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)
  • (如果有任何重要信息请告知我)

无论是否经过调试,\TeXOSQueryXeLaTeX 生成的 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-xelatexxelatex给出相同的结果):

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……除非我用.iniMiKTeX 文件中的变量(默认值:C:\Program Files\MiKTeX 2.9\miktex\config)以及文件名进行了测试。 kpsewhich似乎不允许在该文件夹中使用,即使具有查看/读取权限(或者我做错了)。

只是为了好玩,我texmf.cnf用以下行创建了一个openin_any=a。我将其放在安装(管理员)配置文件夹、本地(用户)配置文件夹以及安装(管理员)根文件夹中。为了安全起见,我每次都会刷新管理员和用户的 FNDB。行为没有改变。

kpsewhich -var-value=openin_any在命令行中运行时,没有任何变化。如果我将openin_any值添加到本地用户变量,该值会随命令一起显示。但是,这个变量/值似乎仍然无法通过-a识别。texosquerykpsewhich

答案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)。

相关内容