有点类似在 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
在我的系统上,dash
shell 在\@@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 的引擎“正确”运行,例如,我在终端中得到此信息:tex
pdftex
## >>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
看看我们得到了什么;该代码适用于pdftex
,luatex
,latex
,pdflatex
;lualatex
但对于tex
,xetex
,xelatex
,我得到:
! 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 程序的包装器来为您执行此操作。