lualatex 使用 popen 运行单个命令(并在文档中显示其输出)

lualatex 使用 popen 运行单个命令(并在文档中显示其输出)

在 Linux/Debian/Sid 上,在任何git存储库内,以下管道提供一些 git 提交 id:

git log --format=oneline -1 --abbrev=16 --abbrev-commit -q | cut -d' ' -f1

例如,在一个目录中,它输出03aa650c1bbd20c3。我想在我的LuaLaTeX文档中显示该字符串。

但是,对于以下lx.tex文件:

% file lx.tex
\documentclass[11pt,a4paper]{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
  pip=io.popen("git log --format=oneline -1 --abbrev=16 --abbrev-commit -q | cut -d' ' -f1")
  gitid=pip:read("l")
  pip:close()
\end{luacode*}
\newcommand{\mygitid}{\luadirect{tex.print(gitid)}}

The gitid is \mygitid
\end{document}

我处理时lualatex --shell-escape --file-line-error --halt-on-error lx出现错误

% lualatex --shell-escape --file-line-error --halt-on-error lx
This is LuaTeX, Version 1.07.0 (TeX Live 2019/dev/Debian) 
 system commands enabled.
(./lx.tex
LaTeX2e <2018-04-01> patch level 5

luaotfload | main : initialization completed in 0.594 seconds (/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size11.clo))
(/usr/share/texlive/texmf-dist/tex/lualatex/luacode/luacode.sty
(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty)
(/usr/share/texlive/texmf-dist/tex/luatex/luatexbase/luatexbase.sty
(/usr/share/texlive/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)))
(./lx.aux)[\directlua]:2: bad argument #1 to 'read' (invalid option)
stack traceback:
    [C]: in function 'read'
    [\directlua]:2: in main chunk.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }

l.8 \end{luacode*}


 350 words of node memory still in use:
   1 hlist, 1 rule, 1 dir, 3 kern, 1 glyph, 3 attribute, 45 glue_spec, 3 attrib
ute_list, 1 write nodes
   avail lists: 2:8,3:1,4:1,5:4,7:2,8:1,9:3
./lx.tex:8:  ==> Fatal error occurred, no output PDF file produced!
Transcript written on lx.log.

但如果我lua5.3在终端中运行以下代码

 % lua5.3            
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> 
>   pip=io.popen("git log --format=oneline -1 --abbrev=16 --abbrev-commit -q | cut -d' ' -f1")
>   gitid=pip:read("l")
>   pip:close()
true    exit    0
> gitid
03aa650c1bbd20c3
> type(gitid)
string

它按我预期的那样工作。

我究竟做错了什么?

答案1

LuaTeX 1.07.0 版默认使用 Lua 5.2,在 Lua 5.2 中必须使用read'*l'而不是read'l'。(为了兼容,read'*l'仍可与 Lua 5.3 配合使用)

因此,您可以将其添加*到参数中,或者如果已安装,read则切换到(带有 Lua 5.3 的 LuaTex)。luatex53

对于:read,参数l或是*l默认值,因此另一个选项是不传递任何参数:(另外我添加了local以避免全局变量pip--no-color因为例如在我的系统上git log输出颜色转义序列)

% file lx.tex
\documentclass[11pt,a4paper]{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
  local pip=io.popen("git log --no-color --format=oneline -1 --abbrev=16 --abbrev-commit -q | cut -d' ' -f1")
  gitid=pip:read()
  pip:close()
\end{luacode*}
\newcommand{\mygitid}{\luadirect{tex.print(gitid)}}

The gitid is \mygitid
\end{document}

相关内容