由于 \endlinechar(空格)字符而找不到文件

由于 \endlinechar(空格)字符而找不到文件

最近的一次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!

相关内容