我可以使用 TeX 获取命令行程序的输出(例如使用 \read18)吗?

我可以使用 TeX 获取命令行程序的输出(例如使用 \read18)吗?

假设我想使用 调用某个外部程序\write18,该程序会将一些文本返回到命令行。我可以从 TeX 内部获取该文本吗?

举个例子

> inkscape -V

在我的例子中,返回 inkscape 安装的版本

Inkscape 0.92.4 (5da689c313, 2019-01-14)

我如何使用 TeX 检索这些信息?

(注意:我在 Windows 上运行 TeX,但希望解决方案与系统无关。)

答案1

您可以使用\input|"inkscape -V"(requires -shell-escape)。但是,我建议定义一个宏,以便您还可以操作输出:

\documentclass{article}
\usepackage{catchfile}

\CatchFileDef{\inkscapebanner}{|"inkscape -V"}{}

\begin{document}

\inkscapebanner

\end{document}

在此处输入图片描述

操纵的一个例子:

\documentclass{article}
\usepackage{catchfile}

\CatchFileDef{\inkscapebanner}{|"inkscape -V"}{}
\makeatletter
\def\@getinkscapeversioninfo#1 #2 #3, #4\@nil{%
  \def\inkscapeversion{#2}%
  \def\inkscapebuild{#3}%
  \def\inkscaperelease{#4}%
}
\expandafter\@getinkscapeversioninfo\inkscapebanner\@nil
\makeatother

\begin{document}

\inkscapebanner\par
\inkscapeversion\par
\inkscapebuild\par
\inkscaperelease\par

\end{document}

在此处输入图片描述

强制expl3版本:

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\tl_new:N \inkscapebanner
\tl_new:N \inkscapeversion
\tl_new:N \inkscapebuild
\tl_new:N \inkscaperelease

\sys_shell_get:nnN { inkscape~-V } { \char_set_catcode_space:n { `~ } } \inkscapebanner
\seq_set_split:NnV \l_tmpa_seq { ~ } \inkscapebanner
\tl_set:Nx \inkscapeversion { \seq_item:Nn \l_tmpa_seq { 2 } }
\tl_set:Nx \inkscapebuild { \seq_item:Nn \l_tmpa_seq { 3 } }
\tl_set:Nx \inkscapebuild { \tl_range:Nnn \inkscapebuild { 1 } { -1 } }
\tl_set:Nx \inkscaperelease { \seq_item:Nn \l_tmpa_seq { 4 } }

\ExplSyntaxOff

\begin{document}

\inkscapebanner\par
\inkscapeversion\par
\inkscapebuild\par
\inkscaperelease\par

\end{document}

相关内容