如何创建一个宏,当定义宏时,该宏可以读取文件的内容?

如何创建一个宏,当定义宏时,该宏可以读取文件的内容?

我正在尝试做类似的事情:

\newcommand{\sometext}{\input{somefile.txt}}

这是可行的,但是每次在文档中使用宏时都需要输入文件。

我想知道一种在定义宏时强制读取文件的方法,这样当在文档中调用宏时,它只代表文本,而不是读取文本的命令。

答案1

您可以使用 Heiko Oberdiek 的包将文件内容读入宏catchfile

\CatchFileDef{\sometext}{somefile.txt}{<setup>}

这将像读取普通 TeX 文件一样读取文件,即它可以包含宏等。对于正常读取的文件,参数可以为空,但可以包含特殊代码,例如逐字读取文件内容或对行尾进行特殊处理等。如果文件包含名称中的宏<setup>,则是一个很好的候选者。\makeatletter@


可以使用 来设置逐字模式\let\do\@makeother\dospecials。您可能还想添加以禁用连字。然后应使用(与 相同)\@noligs排版文本。否则,某些符号(如)将无法正确显示。上述命令需要在 之前和之后使用。\verbatim@font\normalfont\ttfamily_\makeatletter\Catchfile\makeatother

如果要保留行尾,请使用。如果要正常打印空格而不是使用特殊符号,\obeylines您还应添加。还可以添加 以避免点后出现较大的空格。\obeyspaces\frenchspacing

\makeatletter
\CatchFileDef{\sometext}{somefile.txt}{\let\do\@makeother\dospecials\@noligs\obeyspaces\frenchspacing\relax}
\makeatother

% Verbatim text requires a suitable font:
\texttt{\sometext}

确保 中的最后一个命令<setup>不是像 这样的赋值...\endlinechar=-1}。您需要添加\relaxthen,否则 TeX 将扩展 的内部命令来\CatchFileDef查找数字的其余部分。我已经向作者提到了这一点,\relax下一个版本将添加一个内部命令。

相关内容