从名为 的输入文件中获取第 n 行input
并将其传递给名为 的宏的最简单的技术是什么\process
。请注意,我不是在询问逐字输出第 n 行,而是询问捕获该行并将其传递给宏。宏\process
定义如下:
\def\process#1\endprocess{%
% process #1
}
输入文件的第 n 行应作为参数传递#1
给宏\process
。
答案1
\makeatletter
\newread\dongen@in
\newcommand{\dongenprocess}[2]{% #1=file name, #2=line to read
\begingroup\endlinechar=\m@ne
\openin\dongen@in=#1\relax
\count@=\z@
\loop\ifnum\count@<#2\relax
\ifeof\dongen@in
\ERROR
\else
\read\dongen@in to \@tempa
\fi
\advance\count@\@ne
\repeat
\ifx\@tempa\@empty\ERROR\fi
\closein\dongen@in
\expandafter\endgroup
\expandafter\process\@tempa\endprocess
}
\makeatother
如果您尝试越过文件末尾,您将收到一些错误;当然您可以\ERROR
根据需要定义,例如提供后备。我假设行不为空。第二个\ERROR
对应于 TeX 在文件末尾隐式假设的空行。
基本上,我会循环读取一行,直到达到所需的行。然后将\@tempa
(expanded) 传递给\process
。
称之为
\dongenprocess{dongen.dat}{2}
读第二行。
这是一个可能的 LaTeX3 实现:
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\dongenprocess}{mm}
{
\group_begin: \tex_endlinechar:D \c_minus_one
\ior_open:Nn \l_dongen_read_s { #1 }
\prg_replicate:nn {#2}
{
\ior_if_eof:NTF \l_dongen_read_s
{ \dongen_error: }
{ \ior_to:NN \l_dongen_read_s \l_dongen_read_tl }
}
\ior_close:N \l_dongen_read_s
\tl_if_empty:NT \l_dongen_read_tl { \dongen_error: }
\exp_args:NNo \group_end: \dongen_process:n { \l_dongen_read_tl }
}
\ior_new:N \l_dongen_read_s
\tl_new:N \l_dongen_read_tl
\cs_new:Npn \dongen_process:n #1 { \process#1\endprocess }
\cs_new:Npn \dongen_error: { \tl_set:Nn \l_dongen_read_tl { INEXISTENT~LINE } }
\ExplSyntaxOff
编辑:另一个版本\dongenprocess
修剪了从文件读取的输入周围的空格
\NewDocumentCommand{\dongenprocess}{mm}
{
\group_begin:
\ior_open:Nn \l_dongen_read_s { #1 }
\prg_replicate:nn {#2}
{
\ior_if_eof:NTF \l_dongen_read_s
{ \dongen_error: }
{ \ior_to:NN \l_dongen_read_s \l_dongen_read_tl }
}
\ior_close:N \l_dongen_read_s
\tl_trim_spaces:N \l_dongen_read_tl
\tl_if_in:NnT \l_dongen_read_tl { \par } { \dongen_error: }
\exp_args:NNo \group_end: \dongen_process:n { \l_dongen_read_tl }
}