我试图通过\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}
参数中不包含的原语。