输入文件列表

输入文件列表

我想在源代码中包含多个文件。这些文件将包含在以下格式的 liste.tex 文件中:

fichier1.tex
files2.tex
test3.tex
....

我依靠回答问题TikZ 读出文件 但最后一个逗号增加了问题

如何不添加(或删除)最后一个逗号

\documentclass{article}
\usepackage{catchfile,tikz}

\begin{document}

  \CatchFileDef{\tempa}{assocFile.dat}{\endlinechar=`,}
\edef\tempb{\unexpanded{\foreach\tt in }{\unexpanded\expandafter{\tempa}}}
\tempb{\tt \par}

\tempb{    
\input{\tt}
\clearpage
}

\end{document}

答案1

下面是按照相同想法实现的,其中尾随逗号不是问题,因为\clist_map_inline:nn会忽略空项:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\multinput}{sm}
 {
  \IfBooleanTF{#1}
   {
    \rpapa_multinput_list:n { #2 }
   }
   {
    \rpapa_multinput_file:n { #2 }
   }
 }

\tl_new:Nn \l_rpapa_multinput_files_tl

\cs_new_protected:Nn \rpapa_multinput_file:n
 {
  \tl_set_from_file:Nnn \l_rpapa_multinput_files_tl { \endlinechar=`, } { #1 }
  \rpapa_multinput_list:V  \l_rpapa_multinput_files_tl
 }
\cs_new_protected:Nn \rpapa_multinput_list:n
 {
  \clist_map_inline:nn { #1 } { \input{##1}\par }
 }
\cs_generate_variant:Nn \rpapa_multinput_list:n { V }
\ExplSyntaxOff

\begin{document}

\multinput{assocFile.dat}

\bigskip

\multinput*{fichier1,files2,test3}

\end{document}

输入文件只包含“I am”。请注意,*-variant 将以逗号分隔的文件名列表作为参数。

在此处输入图片描述

第二种实现方式是,对“文件名”的情况进行文件本身的映射:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\multinput}{sm}
 {
  \IfBooleanTF{#1}
   {
    \rpapa_multinput_list:n { #2 }
   }
   {
    \rpapa_multinput_file:n { #2 }
   }
 }

\cs_new_protected:Nn \rpapa_multinput_list:n
 {
  \clist_map_inline:nn { #1 } { \input{##1}\par }
 }

\ior_new:N \g_rpapa_multinput_file_stream

\cs_new_protected:Nn \rpapa_multinput_file:n
 {
  \ior_open:Nn \g_rpapa_multinput_file_stream { #1 }
  \ior_map_inline:Nn \g_rpapa_multinput_file_stream
   {
    \input{##1}\par
   }
 }
\ExplSyntaxOff

\begin{document}

\multinput{assocFile.dat}

\bigskip

\multinput*{fichier1,files2,test3}

\end{document}

答案2

在 2024-03-28 的 texlive 更新之后,您可以使用l3sys-query tool(这在受限 shell 转义中是允许的,因此不需要--shell-escape)。

以下小示例将输入所有匹配的文件abc*.tex或打印一条通知,表示没有此类文件。该命令有几个选项可以递归搜索子目录,或对结果进行排序,但基本用法是:

\documentclass{article}
\usepackage{l3sys-query}
\begin{document}

\QueryFilesTF{abc*.tex}
{\input{#1}\clearpage}
{\section{input files matching \texttt(abc*.tex}}
{\textbf{There are no matching files}}

\end{document}

答案3

早上好,我用我最终采用的解决方案来回答我的问题。

我认为使用csvsimple命令

\csvreader{liste.dat}{}{....}

允许我直接访问存储在列表文件

下面的代码是我用从目录导入图像的示例。

我对一些包含下划线的文件名感到困扰,因此使用数学模式来写文件名。我还需要解析带有重音符号的名称。

\documentclass[11pt]{article}  

\usepackage[utf8]{inputenc}  

\usepackage{geometry}  
\geometry{a4paper}  
\geometry{margin=1cm} 

\usepackage{graphicx} 
\usepackage{tikz}
\usetikzlibrary{positioning}    
\usepackage{csvsimple}

\begin{document}

\csvreader{liste.dat}{}{
  \begin{tikzpicture}
  \node(img){
  \includegraphics[width=0.45\textwidth]{\csvcoli}};
  \node[below=1em of img]{$\csvcoli$};
  \end{tikzpicture}
 \hspace{2em}
}

\end{document}

在此处输入图片描述

相关内容