最近的一次MikTeX
更新破坏了我正在使用的一些代码。我有许多文件,里面充满了文件名,代码会读取这些文件名,然后对相应文件的内容进行一些处理。每个文件的内容是 (1) 打印的平衡文本/代码组或 (2) 重复该过程的文件名的某种组合。
我使用 进行编译lualatex
。
问题是,自从我更新以来,由于文件扩展名中附加了行尾字符,因此无法找到文件。我可以使用,\ior_str_map_inline:
但由于某些文件名被注释,因此由于%
文件名开头的 ,我收到文件未找到错误。即使这些文件没有被注释,某些文件中的代码和文件名的组合也意味着如果所有内容都被“字符串化”,那么代码将无法编译。我还尝试将其读取为字符串,然后使用 and 将其转换回标记列表\scantokens
,\scantextokens
但我的尝试没有奏效。
有没有简单的方法可以让一切恢复正常?
ps 文件名确实包含下划线。
\documentclass{article}
\usepackage{xparse}
\begin{filecontents*}{files.tex}
file_1.tex
%file_2.tex
elif_3.tex
\end{filecontents*}
\ExplSyntaxOn
\NewDocumentCommand{\getstuff}{m}
{
\file_if_exist:nT {#1}
{
\ior_open:Nn \g_tmpa_ior {#1}
\ior_map_inline:Nn \g_tmpa_ior
{
% if a filename has been commented, then ##1 will be empty
\tl_if_empty:nTF {##1}
{\tl_show:n {"##1"~is~empty!}}
{
% check whether file exists
\file_if_exist:nTF {##1}
{
% and branch depending on whether filename contains x
\tl_if_in:nnTF {##1}{file}
{\tl_show:n {Success~##1}}
{\tl_show:n {Fail~##1}}
}
{\tl_show:n {"##1"~doesn't~exist!}}
}
}
\ior_close:N \g_tmpa_ior
}
}
\ExplSyntaxOff
\begin{document}
\getstuff{files}
\end{document}
答案1
您看到的是 TeX\endlinechar
在行尾插入了 (通常是空格字符)。您可以使用\tl_trim_spaces:n
或修剪标记列表周围的空格\tl_trim_spaces_apply:nN
,其第二个参数是一个函数,它将空格修剪后的标记列表作为参数(另一种方法是设置\endlinechar=-1
为不插入任何内容)。
\documentclass{article}
\usepackage{xparse}
\begin{filecontents*}{files.tex}
file_1.tex
%file_2.tex
elif_3.tex
\end{filecontents*}
\ExplSyntaxOn
\NewDocumentCommand { \getstuff } { m }
{
\file_if_exist:nT {#1}
{
\ior_open:Nn \g_tmpa_ior {#1}
\ior_map_inline:Nn \g_tmpa_ior
{
% if a filename has been commented, then ##1 will be empty
\tl_if_blank:nTF {##1}
{ \iow_term:n {"##1"~is~empty!} }
{
% check whether file exists
\tl_trim_spaces_apply:nN {##1}
\file_if_exist:nTF
{
% and branch depending on whether filename contains x
\tl_if_in:nnTF {##1}{file}
{ \iow_term:n {Success~##1} }
{ \iow_term:n {Fail~##1} }
}
{ \iow_term:n {"##1"~doesn't~exist!} }
}
}
\ior_close:N \g_tmpa_ior
}
}
\ExplSyntaxOff
\begin{document}
\getstuff{files}
\end{document}
终端显示:
Success file_1.tex
"" is empty!
"elif_3.tex" doesn't exist!