这非常令人沮丧。我可以获取我的 Linux 组 ID 并将其分配给 Latex 计数器。
使用\bash..\END
构造时它可以工作,但使用splice
构造时它不起作用。我将展示 MWE 以进行更多解释。
这有效。我从 bash 获取组 ID,并将其设置为 Latex 计数器:
\documentclass{article}
\usepackage{bashful}
\newcounter{c}
\begin{document}
\bash
id -g
\END
\setcounter{c}{\bashStdout}
my group ID is \arabic{c}
\end{document}
编译pdflatex -shell-esc foo.tex
并显示 PDF 文件
my group ID is 1000
这不起作用:
\documentclass{article}
\usepackage{bashful}
\newcounter{c}
\begin{document}
\setcounter{c}{\splice{id -g}}
my group ID is \arabic{c}
\end{document}
编译错误是
(/usr/local/texlive/2015/texmf-dist/tex/context/base/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
)
! Missing number, treated as zero.
<to be read again>
\immediate
l.8 \setcounter{c}{\splice{id -g}}
?
看起来计数器正在设置前bash 运行并返回 1000 值。所以我需要告诉它先展开吗?我不明白展开命令,但我试过了
\expandafter\setcounter{c}{\splice{id -g}}
和
\setcounter{c}{\expandafter\splice{id -g}}
但什么都没起作用。这显然是评估顺序问题。有没有办法让splice
上面的代码起作用?我想知道为什么它不起作用。
软件包参考这里
这是文档所说的splice
答案1
其工作原理\splice
很容易解释:
% bashful.sty, line 232:
\newcommand\splice[1]{%
\bashIV{#1}%
\expandFileName@BL{\BL@stdoutFile}%
\CatchFileDef{\BL@file@contents}{\BL@stdoutFile}{\relax}%
\ignorespaces\BL@file@contents\unskip
}
它做的第一件事是\bashIV
:
% bashful.sty, line 211:
\newcommand\bashIV[1]{%
\logBL{BashIV: begin}%
\makeDirectory@BL
\generateScriptFile@BL{#1}\relax
\executeScriptFile@BL
\logBL{BashIV: done}%
}%
该命令写出一个执行的脚本,正如我们从定义中看到的那样\executeScriptFile@BL
:
% bashful.sty, line 299:
\newcommand\executeScriptFile@BL{%
\edef\command@BL{\BL@shell \space \BL@scriptFile}%
\if@hide@BL@
\logBL{Adding a "cd command"}%
\edef\command@BL{cd \directory@BL;\command@BL}
\fi%
\edef\command@BL{\command@BL \space >\BL@stdoutFile \space 2>\BL@stderrFile}%
\edef\command@BL{\command@BL \space || echo $? >\BL@exitCodeFile}%
\edef\command@BL{\BL@shell\space -c "\command@BL"}%
\logBL{Executing:^^J \command@BL}%
\immediate\write18{\command@BL}%
}%
标准输出被重定向到\BL@stdoutFile
(代表一个具有扩展名的唯一命名的文件.stdout
。
该文件被读入\CatchFileDef
并将其内容存储\BL@file@contents
在印刷正如\ignorespaces
和所证明的那样\unskip
。
没有真正的方法可以使这个工作在参数中起作用,\setcounter
该参数应该是扩展为数字的东西,而不是打印数字的指令。
您可以定义不同的命令:
\makeatletter
\newcommand{\splicesave}[2]{%
\bashIV{#1}%
\expandFileName@BL{\BL@stdoutFile}%
\CatchFileDef{#2}{\BL@stdoutFile}{}% \relax was redundant
}
\makeatother
并做
\splicesave{id -g}{\foo}
\setcounter{c}{\foo}