如何使用参数自动包含文件?

如何使用参数自动包含文件?

我正在整理一系列书籍,这些书籍使用了其他文件的内容。我希望将每个参考资料放在一个文件中,以避免冗余内容,并更轻松地查看和更正内容。

让我解释一下,我为每个参考编号创建了一个文件,例如:

CEC/n/0001.tex
CEC/n/0002.tex
CEC/n/0003.tex
CEC/n/0004.tex
CEC/n/0005.tex
CEC/n/0006.tex
CEC/n/0007.tex
....
CEC/n/9999.tex

假设我需要在我的一本书中包括数字 1 到 5、数字 22 和数字 17。我目前正在执行以下操作,效果良好:

\input{../../CEC/n/0001}

\input{../../CEC/n/0002}

\input{../../CEC/n/0003}

\input{../../CEC/n/0004}

\input{../../CEC/n/0005}

\input{../../CEC/n/0022}

\input{../../CEC/n/0017}

有没有什么方法可以简化它?

我的想法是能够接收一个数字数组[1,2,3,4,5,22,17][1 to 5 AND 22 AND 17]使用它来按名称包含每个文件?我需要在卷的不同部分包含许多像上面这样的参考组合,我想简化这个任务。

抱歉,由于文件包含问题,我无法创建一个最小的可验证的示例。

答案1

如果文件名具有通用结构,则以下一组宏可以完成此任务。主命令是

\multiinput{<prefix>}{<format>}{<list>}[<post action>]

在你的情况下

\multiinput{../../CEC/n/}{0000}{1-5,22,17}

代码,在第二种情况下,我将其添加\par为在文件输入后要执行的后续操作。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\multiinput}{mmm+O{}}
 {% #1 = fixed part
  % #2 = format for the variable part
  % #3 = list
  % #4 = post action
  \cedano_multiinput:nnnn { #1 } { #2 } { #3 } { #4 }
 }

\seq_new:N \l__cedano_multiinput_items_seq
\seq_new:N \l__cedano_multiinput_interval_seq

\cs_new_protected:Nn \cedano_multiinput:nnnn
 {
  % split the list at commas
  \seq_set_split:Nnn \l__cedano_multiinput_items_seq {,} { #3 }
  \seq_map_inline:Nn \l__cedano_multiinput_items_seq
   {
    \__cedano_multiinput_item:nnnn { #1 } { #2 } { ##1 } { #4 }
   }
 }

\cs_new_protected:Nn \__cedano_multiinput_item:nnnn
 {
  \seq_set_split:Nnn \l__cedano_multiinput_interval_seq { - } { #3 }
  \int_compare:nTF { \seq_count:N \l__cedano_multiinput_interval_seq = 1 }
   {% just one item
    \__cedano_multiinput_file:nnnn { #1 } { #2 } { #3 } { #4 }
   }
   {% multiple files
    \int_step_inline:nnn
     { \seq_item:Nn \l__cedano_multiinput_interval_seq { 1 } } % start
     { \seq_item:Nn \l__cedano_multiinput_interval_seq { 2 } } % end
     { \__cedano_multiinput_file:nnnn { #1 } { #2 } { ##1 } { #4 } }
   }
 }

\cs_new_protected:Nn \__cedano_multiinput_file:nnnn
 {
  \file_input:n { #1 \__cedano_multiinput_pad:nn { #2 } { #3 } } #4
 }

\cs_new:Nn \__cedano_multiinput_pad:nn
 {
  \prg_replicate:nn { \tl_count:n { #1 } - \tl_count:n { #2 } } { 0 } #2
 }

\ExplSyntaxOff

\begin{document}

\textbf{From 1 to 10}

\multiinput{inputs/}{0000}{1-10}

\bigskip

\textbf{Selection}

\multiinput{inputs/}{0000}{1-2,4,7,9-10}[\par]

\end{document}

我在子目录中创建了包含以下内容的inputs文件0001.tex0010.tex

I'm number XXXX

在此处输入图片描述

相关内容