给定文件名列表,我想获得每个文件的字数,但是通过使用\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}