使用 \input 为 VerbatimOut 生成文件名时出现错误“Bad space factor (0)。”

使用 \input 为 VerbatimOut 生成文件名时出现错误“Bad space factor (0)。”

我想逐字逐句地输出一些文本到$TMPDIR/myFile.txt,然后对该文件执行一些其他操作。

注意:为了允许 LaTeX 写入当前文件夹之外的文件,您需要:

  • 运行 LaTeX 以--shell-escape允许\input
  • 添加openout_any=atexmf.cnf允许写入任何文件夹(可通过终端找到kpsewhich texmf.cnf

我正在尝试通过\input{|echo $TMPDIR/myFile.txt}以下方式获取真实文件路径:
https://stackoverflow.com/questions/3252957/how-to-execute-shell-script-from-latex

具有完整最小复制:

\documentclass[11pt]{article}
\usepackage{fancyvrb}

\begin{document}

\newcommand{\myFile}{\immediate\input{|echo $TMPDIR/myFile.txt}}
\begin{VerbatimOut}{\myFile}
my file contents here <> {} () $ "" ''.
\end{VerbatimOut}
% ... do something on disk with \myFile

\end{document}

Bad space factor (0).然而,这会在线路上产生错误\end{VerbatimOut}

可能相关:
! 不良空间系数 (0)
但答案 ( \leavevmode) 听起来很具体seriate

为什么会产生这个错误?有没有办法实现上述目标?

答案1

您可以\sys_get_shell:nnN使用expl3

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\getfromshell}{mO{}m}
 {% #1 = command, #2 = setup, #3 = control sequence
  \sys_get_shell:nnN { #1 } { #2 } #3
  \tl_trim_spaces:N #3
 }

\ExplSyntaxOff

\begin{document}

\getfromshell{kpsewhich -expand-var=$TMPDIR/myfile.txt}{\myfile}

\ExplSyntaxOn
\tl_analysis_show:N \myfile
\ExplSyntaxOff

\texttt{\myfile}% just to test

\end{document}

两端的空格都被剪掉了。我更希望kpsewhich -expand-var它与系统无关不需要 shell 转义。

当然,你可以传递\myfile给。我使用以下调用进行了测试VerbatimOut

TMPDIR=foo pdflatex davidfink

(我给了不同的值TMPDIR只是为了不得到过长的输出/var/folders/8b/hx9v58ln1txgzv4v32_vpbr40000gq/T/)并且控制台显示

The token list \myfile contains the tokens:
>  f (the letter f)
>  o (the letter o)
>  o (the letter o)
>  / (the character /)
>  m (the letter m)
>  y (the letter y)
>  f (the letter f)
>  i (the letter i)
>  l (the letter l)
>  e (the letter e)
>  . (the character .)
>  t (the letter t)
>  x (the letter x)
>  t (the letter t).

最后

在此处输入图片描述

已打印。

完整语法是

\getfromshell{<command line>}[<setup>]<control sequence>

<setup>参数可用于设置在返回特殊字符的情况下的类别代码<command line>

答案2

LaTeX\input使用\@ifnextchar且不可扩展。您可以使用原始的。

\documentclass[11pt]{article}
\usepackage{fancyvrb}

\begin{document}
\makeatletter
\newcommand{\myFile}{\@@input"|echo myFile.txt" }
\makeatother
\begin{VerbatimOut}{\myFile}
my file contents here <> {} () $ "" ''.
\end{VerbatimOut}
% ... do something on disk with \myFile

\end{document}

相关内容