在循环中将变量与字符串连接起来

在循环中将变量与字符串连接起来

我想在循环中使用 subfile 向文档添加新页面,具体取决于 .txt 文件中的行数。.txt
可能如下所示:

0001
0002
0003

.tex 子文件是 A0001.tex、A0002.tex、A0003.tex

我的代码:

\documentclass{article}
\usepackage{subfiles}
\usepackage{forloop}

\begin{document}%
%
\newread\file%
    \openin\file=mytextfile.txt%
        \loop\unless\ifeof\file%
            \read\file to\linecontent%
            \subfile{A\linecontent}
            \newpage%
        \repeat%
    \closein\file%
\end{document}

尽管 .pdf 已创建并且看起来正确,但我还是收到了代码行 22(\rep​​eat)的错误消息。

段落在@iinput 完成之前结束。

额外},或者忘记了\endgroup。@import ...er #1\expandafter {\import@path@file }

如果我将子文件输入更改为仅一个子文件(A0001),则不会出现错误,但它会添加 4 !新页面好像.txt文件中有4行。

\subfile{A0001}

我想我忽略了一些小细节,但我真的不知道是什么。

答案1

主要问题是的内容\linecontent以空格结尾,应该将其删除。

这是一个具有预定义循环的更简单的实现expl3(避免重新发明轮子):

\documentclass{article}
\usepackage{subfiles}

\ExplSyntaxOn

\NewDocumentCommand{\batchsubfiles}{m +O{}}
 {% #1 = file name, #2 = code to execute after each \subfile command
  \patrix_batchsubfiles:nn { #1 } { #2 }
 }

\ior_new:N \g_patrix_batchsubfiles_ior

\cs_new_protected:Nn \patrix_batchsubfiles:nn
 {
  \ior_open:Nn \g_patrix_batchsubfiles_ior { #1 }
  \ior_map_inline:Nn \g_patrix_batchsubfiles_ior
   {
    \subfile{A##1}
    #2
   }
 }

\ExplSyntaxOff

\begin{document}

\textbf{Nothing in between}

\batchsubfiles{subfiles.txt}

\bigskip

\textbf{With paragraph break after subfiles}

\batchsubfiles{subfiles.txt}[\par]

\end{document}

subfiles.txt文件是

0001
0002
0003

并且子文件包含以下输出中明显存在的内容。

在此处输入图片描述

一些解释

  1. \ior_new:N \g_patrix_batchsubfiles_ior类似于\newread\file

  2. \ior_open:N \g_patrix_batchsubfiles_ior { filename }类似于;此处文件名通过内部函数\openin\file=filename作为强制参数传递给\batchsubfiles\patrix_batchsubfiles:nn

  3. \ior_map_inline:Nn是您使用的构造的类似物\loop,但具有以下几个优点:

    • 不需要测试\ifeof
    • 文件末尾隐含的空行将被自动忽略
    • 没有必要使用控制序列来存储当前行的内容,只需使用#1##1因为我们在定义中
    • 行尾的隐式空格将被自动忽略
  4. 映射在一行上完成

  5. 你也可以在循环体中进行测试,如果满足某些条件,则中断循环;例如,可以测试空行,如果发现

    \tl_if_empty:nT { ##1 } { \ior_map_break: }
    

答案2

欢迎使用 TeX.SX!我遇到了一个与你不同的错误,这是因为 TeX 默认在从另一个文件读取的每一行后插入一个空格(另请参阅这里)。然后代码会查找一个名为的文件,例如,A0001 .tex该文件不存在,最终会引发此错误。因此,我插入了\endlinechar=-1您的代码,以抑制此尾随空格。我假设这也是您的问题的解决方案,尽管您遇到了不同的错误。

我进一步添加了一个\if子句来测试是否\linecontets包含任何字符,因为在读入时文件末尾将被视为一个额外的空行。这也是为什么你的.txt文件只有三行却得到四页的原因。

\documentclass{article}
\usepackage{subfiles}
\usepackage{forloop}

\begin{document}%
%
\newread\file%
    \openin\file=mytextfile.txt%
    \begingroup\endlinechar=-1 %
        \loop\unless\ifeof\file%
            \read\file to \linecontent%
            \ifx\linecontent\empty\else%
                \subfile{A\linecontent}
            \fi%
            \newpage%
        \repeat%
    \endgroup%
    \closein\file%
\end{document}

相关内容