我想逐字逐句地输出一些文本到$TMPDIR/myFile.txt
,然后对该文件执行一些其他操作。
注意:为了允许 LaTeX 写入当前文件夹之外的文件,您需要:
- 运行 LaTeX 以
--shell-escape
允许\input
- 添加
openout_any=a
以texmf.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}