请问一下,在 LaTeX 中如何使用 for-loop 包含一组文件呢?
MWE.tex 如下。
\documentclass[12pt,UTF8]{ctexart}
\usepackage{listings}
\begin{document}
%List of files:
% bco0.dat fco1.dat hcpm0.dat, ...
\lstinputlisting{./src/bmdl/bco0.dat}
\lstinputlisting{./src/bmdl/fco1.dat}
\lstinputlisting{./src/bmdl/hcpm0.dat}
% ...
\end{document}
可以发现在上述代码中多次重复使用 lstinputlisting 语句,现在希望将该语句放在 foreach 循环中重复执行,所要表达的意思如下的伪代码所示。
伪代码如下。
ListOfFiles = {bco0.dat, fco1.dat, hcpm0.dat}; % 这是一个文件列表,用于存放需要包含的文件的名字
NumOfFiles = NumOfElements(ListOfFiles); % 这是文件的总数,用于 for 循环
for i = 1:1:NumOfFiles
path = "path/to/file" & ListOfFiles(i);
\lstinputlisting{path};
endfor
下面这一段代码可以实现 foreach 的功能,但是我还是希望把文件集合放置在一个单独的数组 ListOfFiles 中,即 ListOfFiles = {bco0.dat, fco1.dat, hcpm0.dat}。
\foreach \i in {bco0.dat, fco1.dat, hcpm0.dat}
{
\lstinputlisting{./src/bmdl/\i}
}
\newcommand*{\ListOfFiles}
{
bco0.dat,
fco1.dat,
hcpm0.dat
}
\foreach \i in \ListOfFiles
{
\lstinputlisting{./src/bmdl/\i}
}
如果待使用的文件在同一文件夹内,命名无规则且文件数量多,可以参考下
用LaTeX3通过遍历插入指定目录中的所有图像
% 使用LaTeX3遍历图像目录中的图像并实现插图
\documentclass{ctexart}
% 需要的宏包
\usepackage{expl3}
\usepackage{xparse}
\usepackage{graphicx}
\usepackage{zhlipsum}
% 开启LaTeX3环境
\ExplSyntaxOn
% 插图标签处理函数
\cs_new_protected:Nn \fig_label:N
{
#1 % 可以是\label 或 \ref
{
fig \c_colon_str
% 整数转换为小写罗马数字
\int_to_roman:n {\l_cnt_int}
}
}
% 声明计数整数变量,并赋初值为1
\int_new:N \l_cnt_int
\int_set:Nn \l_cnt_int {1}
% 声明文件名列表变量
\tl_new:N \l_figs_tl
% 创建clist
\clist_new:N \l_figs_clist
% 定义排版命令,默认排版当前目录下figs目录下的图像
\NewDocumentCommand{\figslist} {O{figs}}
{
% 调用命令“ls -m #1/*”命令列出当前指定目录下的文件,并保存在\l_figs_tl中
\sys_get_shell:nnN {ls~-m~#1/*}{}\l_figs_tl
% 设置clist
\clist_set:NV \l_figs_clist \l_figs_tl
% 遍历clist并实现插图及label和ref引用
\clist_map_inline:Nn \l_figs_clist
{
\zhlipsum[1]\par
如``图\fig_label:N \ref''所示\par
\begin{figure}[!htb]
\centering
\includegraphics[width=0.35\textwidth]{##1}
\caption{##1}
\fig_label:N \label
\end{figure}
\int_incr:N \l_cnt_int
}
}
\ExplSyntaxOff
\begin{document}
\figslist
\figslist[pics]
\end{document}