如何在 etoolbox 列表处理中使用 bashful 包?

如何在 etoolbox 列表处理中使用 bashful 包?

给定文件名列表,我想获得每个文件的字数,但是通过使用\forcsvlist\docsvlist并将文件名从 Latex 传递给 bash,而不在 bash 命令中对文件名进行硬编码,而是通过使用传递给 的参数\docsvlist

我无法让它工作。这是我尝试做的 MWE,但根本不起作用

\documentclass{article}
\usepackage{etoolbox}
\usepackage{graphicx}
\usepackage{bashful}
\begin{document}
\renewcommand*{\do}[1]{%
The file #1 has size
\bash
wc #1
\END
\bashStdout

}
\docsvlist{foo.log,foo.tex}
\end{document}

现在

 pdflatex --shell-esc  foo.tex

(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg))
! Use of \bashIII doesn't match its definition.
<recently read> w

l.17 \docsvlist{foo.log,foo.tex}

expandafter我认为我需要expandonce或这些命令之一,但我仍然不明白它们是如何工作的或在哪里使用它们。包文档没有很多示例来帮助理解如何使用这些命令。

如果我将 bash 命令移到外面,那么它当然可以起作用:

\documentclass{article}
\usepackage{etoolbox}
\usepackage{graphicx}
\usepackage{bashful}
\begin{document}
\renewcommand*{\do}[1]{%
The file #1 has size

}
\docsvlist{foo.log,foo.tex}

\bash
wc foo.tex
\END
\bashStdout    
\end{document}

但是我需要在列表项上使用 bash 命令,将当前列表项传递#1给 bash 命令,并获取要使用的 bash 命令的输出。

上述操作可以实现吗?

2015 年

答案1

您不能将其用作\bash另一个命令的参数,因为它使用了逐字模式的某种变体。

有一种简单的方法可以解决这个问题,无需额外的软件包,即使用“管道输入”:如果原始\input命令参数中的第一个标记是|,则文件名将被视为要执行的 shell 命令,本质上是将 TeX 文件作为标准输出。TeX Live 和 MiKTeX 都允许(在本例中推荐)在文件名周围使用引号。

\documentclass{article}
\usepackage{etoolbox}

\makeatletter
\newcommand{\shellcommand}[1]{\@@input"|#1"}
\makeatother

\begin{document}

\renewcommand*{\do}[1]{%
  The file #1 has size \texttt{\shellcommand{wc #1}}\par
}

\docsvlist{fontaw.tex,fontaw.log}
\end{document}

在此处输入图片描述

相关内容