假设我想使用 调用某个外部程序\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}