文件名 从 txt 文件读取的无效字符

文件名 从 txt 文件读取的无效字符

你好,关注这篇文章逐行读取文本文件以绘制多个图表,我创建了一个乳胶代码来读取包含我想要绘制的 eps 文件名称的文件。

我的代码是:

\documentclass[]{article}

\usepackage{url}
\usepackage[T1]{fontenc}

\newcommand\noblankfileline{\expandafter\noblankaux\fileline\relax}
\def\noblankaux#1 \relax{#1}

\begin{document}
 \newread\file
 \openin\file=accretion.txt
 \loop\unless\ifeof\file
  \read\file to \fileline % Reads a line of the file into \fileline
  \if\relax\fileline\relax\else
    \begin{figure}[!ht]
    \centering
    \includegraphics[width=10cm,height=10cm]{"./pictures/\noblankfileline"}
    \end{figure}
  \fi
 \repeat
 \closein\file
\end{document}

txt 文件内容如下:

run20150131_Sediment_Accretion_Erosion_2015-01-31_23h-30m.eps run20150228_Sediment_Accretion_Erosion_2015-02-28_23h-30m.eps run20150331_Sediment_Accretion_Erosion_2015-03-31_23h-30m.eps run20150430_Sediment_Accretion_Erosion_2015-04-30_23h-30m.eps

当我编译它时出现此错误:

! Text line contains an invalid character.
<read 1> r 
           u n 2 0 1 5 0 1 3 1 _ S e d i m e n t _ A c c r e t i o n _ E r o...
l.22         \repeat

它就像代码不能将来自文件的输入识别为单个单词。

你知道该怎么修复吗?谢谢!Ciccio

答案1

daleif 的答案是最好的,但我认为值得解释一下为什么您的方法在编译时失败。这是一个扩展问题。似乎搜索\includegraphics文件名以查找文件扩展名。问题是搜索发生在\noblankfileline扩展之前,因此没有注意到扩展名。然后,当\includegraphics最终开始扩展时\noblankfileline,它不知道如何处理附加到文件名的扩展名。

MWE 中提供的修复方法是扩展\noblankfilename一个\edef,并将扩展的宏用作 的参数\includegraphics。或者,正如我在之前的评论中所说,您可以修改\noblankaux以从列表中删除文件扩展名,因为\includegraphics将搜索所有有效扩展名以寻找合适的扩展名。可以使用以下重新定义来做到这一点:\def\noblankaux#1.#2 \relax{#1}

但正如我所说,daleif 的答案更适合您的条件,因为您在列表中提供了文件扩展名,因此文件名和文件扩展名之间永远不会出现虚假空格。因此,\noblankfilename对于您的情况来说,整体并不是必需的。

\documentclass[]{article}
\usepackage{graphicx}
\usepackage{filecontents}
\begin{filecontents*}{accretion.txt}
run20150131_Sediment_Accretion_Erosion_2015-01-31_23h-30m.png
%run20150228_Sediment_Accretion_Erosion_2015-02-28_23h-30m.eps
%run20150331_Sediment_Accretion_Erosion_2015-03-31_23h-30m.eps
%run20150430_Sediment_Accretion_Erosion_2015-04-30_23h-30m.eps
\end{filecontents*}

\usepackage{url}
\usepackage[T1]{fontenc}

\newcommand\noblankfileline{\expandafter\noblankaux\fileline\relax}
\def\noblankaux#1 \relax{#1}

\begin{document}
 \newread\file
 \openin\file=accretion.txt
 \loop\unless\ifeof\file
  \read\file to \fileline % Reads a line of the file into \fileline
  \if\relax\fileline\relax\else
    \begin{figure}[!ht]
    \centering
    \edef\tmp{./pictures/\noblankfileline}
    \includegraphics[width=3cm,height=3cm]{\tmp}
    \end{figure}
  \fi
 \repeat
 \closein\file
\end{document}

在此处输入图片描述

答案2

这似乎满足了你的需要

\documentclass[]{article}
\usepackage{url,graphicx}
\usepackage[T1]{fontenc}
\begin{document}
\begingroup
 \newread\file
 \openin\file=accretion.txt
 \endlinechar-1%<- this removes the space at the end of each read line
 \loop\unless\ifeof\file
  \read\file to \fileline% Reads a line of the file into \fileline
  \if\relax\fileline\relax\else
   \begin{figure}[!ht]
    \centering
     \includegraphics[width=10cm,height=10cm]{\fileline}
    \end{figure} 
  \typeout{X\fileline X}
  \fi
 \repeat
 \closein\file
 \endgroup
\end{document}

我主要在看\typeout

你删除末尾空格的宏可能永远不会被扩展

\endlinechar-1是我在网站上找到的东西

答案3

逐行expl3读取文件会更容易一些:

\begin{filecontents*}{accretion.txt}
run20150131_Sediment_Accretion_Erosion_2015-01-31_23h-30m.png
run20150228_Sediment_Accretion_Erosion_2015-02-28_23h-30m.png
run20150331_Sediment_Accretion_Erosion_2015-03-31_23h-30m.png
run20150430_Sediment_Accretion_Erosion_2015-04-30_23h-30m.png
\end{filecontents*}

\documentclass{article}
\usepackage{xparse}
\usepackage[draft]{graphicx} % draft because I haven't your files

\ExplSyntaxOn
\NewDocumentCommand{\figuresfromfile}{O{}m}
 {
  \ior_open:Nn \g_ciccio_figuresfile_ior { #2 }
  \ior_str_map_inline:Nn \g_ciccio_figuresfile_ior
   {
    \begin{figure}[!ht]
    \centering
    X{\scriptsize\ttfamily ##1}X\\ % just for debugging
    \includegraphics[#1]{##1}
    \end{figure}
   }
  \ior_close:N \g_ciccio_figuresfile_ior
 }
\ior_new:N \g_ciccio_figuresfile_ior
\ExplSyntaxOff

\begin{document}

\figuresfromfile[width=10cm,height=10cm]{accretion.txt}

\end{document}

添加此X...X\\行是为了表明文件名被吸收,两端没有空格。

在此处输入图片描述

相关内容