我想在循环中使用 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(\repeat)的错误消息。
段落在@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
并且子文件包含以下输出中明显存在的内容。
一些解释
\ior_new:N \g_patrix_batchsubfiles_ior
类似于\newread\file
\ior_open:N \g_patrix_batchsubfiles_ior { filename }
类似于;此处文件名通过内部函数\openin\file=filename
作为强制参数传递给\batchsubfiles
\patrix_batchsubfiles:nn
\ior_map_inline:Nn
是您使用的构造的类似物\loop
,但具有以下几个优点:- 不需要测试
\ifeof
- 文件末尾隐含的空行将被自动忽略
- 没有必要使用控制序列来存储当前行的内容,只需使用
#1
;##1
因为我们在定义中 - 行尾的隐式空格将被自动忽略
- 不需要测试
映射在一行上完成
你也可以在循环体中进行测试,如果满足某些条件,则中断循环;例如,可以测试空行,如果发现
\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}