宏扩展到文件的内容?

宏扩展到文件的内容?

我如何定义一个宏以便它扩展到文件的内容?

答案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 }}

相关内容