你好,关注这篇文章逐行读取文本文件以绘制多个图表,我创建了一个乳胶代码来读取包含我想要绘制的 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\\
行是为了表明文件名被吸收,两端没有空格。