我正在尝试做类似的事情:
\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}
。您需要添加\relax
then,否则 TeX 将扩展 的内部命令来\CatchFileDef
查找数字的其余部分。我已经向作者提到了这一点,\relax
下一个版本将添加一个内部命令。