我想在源代码中包含多个文件。这些文件将包含在以下格式的 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}