如何在 \input 中包含新命令

如何在 \input 中包含新命令

我试图通过\lbname在 LaTeX 中创建新命令来改变文件名。通过打印\lbname,我得到了lo3.txt这个例子,但它在命令中不起作用\input。我收到错误“TeX 容量超出,抱歉 [输入堆栈大小=5000]”。

\newcommand{\experr}{\input{examp_error..txt}}
\newcommand{\lbname}{lo\experr\unskip .txt}
\newcommand{\lb}{\input{\lbname}}

答案1

问题中的片段存在一些问题:

  • \input{}不可扩展,因为它还会检查文件是否存在。\@@input可以使用原语来代替,但还有更好的方法,见下文。

  • \unskip也是不可扩展的,因此不能用作文件名的一部分。请参阅包trimspaces以删除宏末尾的空格。

通过使用包可以避免这两个问题catchfile。假设文件examp_err.txt(问题中的两个点是拼写错误?)包含数字3,那么

\CatchFileEdef\experr{examp_error.txt}{\endlinechar=-1 }

将定义宏\experr,它扩展为3\endlinechar=-1删除行尾,否则将转换为空格。因此不需要\unskip或 包。trimspaces

然后,\experr可以安全地用作文件名的一部分:

\newcommand*{\lbname}{lo\experr.txt}

或者

\edef\lbname{lo\experr.txt}

\lbname然后就可以使用该文件名\input或执行任何您想用它做的事情。

完整代码片段:

\usepackage{catchfile}

\CatchFileEdef\experr{examp_error.txt}{\endlinechar=-1 }
\edef\lbname{lo\experr.txt}

如果examp_error.txt包含3,则\lbname扩展为lo3.txt

答案2

TeX 原始级别的另一种解决方案:

\newread\exfile
\openin\exfile=examp_error.txt % the file where "3" or similar is included"
\ifeof\exfile \def\experr{} \errmessage{the file examp_error.txt doesn't exist}
\else {\endlinechar=-1 \global\read\exfile to\experr}\fi
\input lo\experr.txt % does \input lo3.txt or something similar

这在传统 TeX 和 LaTeX 中都有效。请注意,这\input是非 LaTeX 格式中的 TeX 原语。因此,我们将其用作{braces}参数中不包含的原语。

相关内容