检测当前正在运行的可执行文件-以及 Latex 的使用情况?

检测当前正在运行的可执行文件-以及 Latex 的使用情况?

有点类似在 pdflatex 中获取 Texlive 版本?,现在我想获取 *tex 运行中当前正在运行的可执行文件。

谢谢Write18:捕获 shell(脚本)输出作为命令/变量?,我可以运行 shell 命令并使用 获取输出-shell-escape。因此,如果我们使用的是 Unix/Linux 系统,首先我们可以尝试查看报告的内容echo $0(注意:以下内容显然必须作为一行键入/粘贴):

pdflatex -shell-escape '\documentclass{minimal} \begingroup\makeatletter\endlinechar=\m@ne\everyeof{\noexpand} \edef\x{\endgroup\def\noexpand\TeXcmdout{\@@input|"echo $0" }}\x \begin{document} \typeout{>>is: \TeXcmdout} \end{document}'

得出的结果为:

>>is: sh

因此,pdflatex在我的系统上,dashshell 在\@@input管道上运行。因此,我们现在可以尝试检查此 shell 的父进程 ID ( );例如,在该 shell 中$PPID运行:cat /proc/$PPID/status | grep Name

pdflatex -shell-escape '\documentclass{minimal} \begingroup\makeatletter\endlinechar=\m@ne\everyeof{\noexpand} \edef\x{\endgroup\def\noexpand\TeXcmdout{\@@input|"cat /proc/$PPID/status | grep Name" }}\x \begin{document} \typeout{>>is: \TeXcmdout} \end{document}'

得出的结果为:

>>is: Name: pdflatex

因此,如果我使用 write18 ( -shell-escape) 和 Linux shell,并愿意运行一些系统命令,我可以找到当前正在运行的可执行文件。但是,我想不是运行-shell-escape,并且我最好喜欢跨平台的解决方案。

从第一个链接开始(和有没有办法从包内部检测是否使用了 MiKTeX?),希望\pdftexbanner能够使用。因此,我首先尝试使用 shell 编写以下打印输出测试bash

for iprog in {tex,pdftex,luatex,xetex,httex,latex,pdflatex,lualatex,xelatex,htlatex}; do \
 echo "## >>$iprog<<"; \
 $iprog "\nonstopmode \
   \immediate\write0{>> Testing terminal printout...} \
   \end"; \
 done

请注意,这将至少htlatex调用两次。这里的问题是,此代码对于基于 TeX 的引擎“正确”运行,例如,我在终端中得到此信息:texpdftex

## >>pdftex<<
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded format=pdftex)
 restricted \write18 enabled.
entering extended mode

>> Testing terminal printout...
No pages of output.
Transcript written on texput.log.

...我在基于 LaTeX 的引擎的输出中看到了一些错误,例如pdflatex

## >>pdflatex<<
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
LaTeX2e <2014/05/01>
Babel <3.9l> and hyphenation patterns for 25 languages loaded.

>> Testing terminal printout...
! Emergency stop.
<*> ...e0{>> Testing terminal printout...}    \end

!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on texput.log.

在这种情况下没有什么严重的问题;但是:我猜,\end在 Latex 中需要一个参数(并且在 TeX 中是一个“独立”原语),并且\stop那里的 会处理这个错误 - 但是,\stop作为一个 Latex 宏,Tex 无法理解,所以我会在那里收到错误。

这让我想到 - 有一个变量或开关可以告知当前运行的引擎是否基于 Latex 可能会很有用;所以我将利用这个机会询问是否存在类似的东西?

不管怎样,回过头来\pdftexbanner,我们可以把它粘贴到上面的 shell 代码循环中:

for iprog in {tex,pdftex,luatex,xetex,httex,latex,pdflatex,lualatex,xelatex,htlatex}; do \
 echo "## >>$iprog<<"; \
 $iprog "\nonstopmode \
   \immediate\write0{>> is: \pdftexbanner} \
   \end"; \
 done

看看我们得到了什么;该代码适用于pdftexluatexlatexpdflatexlualatex但对于texxetexxelatex,我得到:

! Undefined control sequence.
<write> >> is: \pdftexbanner 

<inserted text> 
                }\endwrite 
<*> ...    \immediate\write0{>> is: \pdftexbanner}
                                                      \end
>> is: 
(see the transcript file for additional information)
No pages of output.
Transcript written on texput.log.

... 也就是说(如上文所述),\pdftexbanner这些引擎并不存在。

因此,我的问题是 - 有什么东西可以用来确定 *tex 运行的当前正在运行的可执行文件,而无需诉诸于write18对 shell 的明确查询?

答案1

如果你的监督环境(例如如果要让运行 TeX 的 shell 脚本知道它运行的是哪个 TeX 程序,只需让它将此信息写入你的 TeX 宏可以读取的文件中。

如果您正在运行 UNIX 系统,您可以快速编写 TeX 程序的包装器来为您执行此操作。

相关内容