我如何定义一个宏以便它扩展到文件的内容?
答案1
您catchfile.sty
也可以使用 Plain TeX,前提是您使用的pdftex
是具有 e-TeX 扩展的版本。对于 Knuth TeX,恐怕是没有希望的。
\input catchfile.sty
\CatchFileDef{\foo}{\jobname.tex}{}
\show\foo
输出如下:
> \foo=macro:
->\input catchfile.sty \par \CatchFileDef {\foo }{\jobname .tex}{} \par \show \foo \par .
当然,这只是为了使示例独立;使用\foo
会非常危险。
您可以在尾随参数中添加设置,例如 catcodes 或\endlinechar
。
\CatchFileEdef
文件的内容将会完全展开。
通过逐行读取文件可以获得没有 e-TeX 扩展的近似值:
\catcode`@=11
\newread\catch@in
\def\catchfile#1#2#3{%
\begingroup
#3%
\toks@={}%
\openin\catch@in=#2
\catch@file
\edef\temp{\the\toks@}%
\expandafter\endgroup
\expandafter\def\expandafter#1\expandafter{\temp}%
}
\def\catch@file{%
\ifeof\catch@in
\else
\read\catch@in to \temp
\toks@=\expandafter\expandafter\expandafter{\the\expandafter\toks@\temp}%
\expandafter\catch@file
\fi
}
\catcode`@=12
\catchfile{\foo}{test.tex}{}
\show\foo
示例文件test.tex
是
first line
\noindent x
y
x
输出为
> \foo=macro:
->first line \par \noindent x y x \par .
答案2
eTeX 寄存器\everyeof
可用于:
\everyeof = {EndOfFile!}
\long\def\scanfile#1EndOfFile!{\def\filecontent{#1}}
\expandafter\scanfile \input file
\everyeof = {}
如果文件内容可以在读取过程中扩展,那么还有更简单的解决方案:
{\everyeof={\noexpand}\xdef\filecontent{\input file }}