如何使用 bashful splice 的输出将其分配给 Latex 计数器?

如何使用 bashful splice 的输出将其分配给 Latex 计数器?

这非常令人沮丧。我可以获取我的 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

Mathematica 图形

答案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}

相关内容