我想迭代某个目录中的所有图像,并从中导入每个图像\includegraphics
。MainInput.tex
批处理文件IterateFiles.bat
可帮助我们在指定目录中创建图像名称列表。
rem IterateFiles.bat
echo off
rem %1 represents the path (relative to the main input file) to the files to be iterated
rem %2 represents the output file name
rem the remaining args represent the extensio of file to be iterated
set curdir=%CD%
cd %1
shift
set output=%curdir%\%1.list
copy nul %output%
shift
:loop
if "%1"=="" goto :eof
dir /b *.%1 >> %output%
shift
goto :loop
宏的当前实现\IterateFiles
需要 3 个参数。前 2 个参数是保存图像的目录的路径(相对于MainInput.tex
)。这里不好的地方是我们需要以 2 种形式指定相同的路径: ..\dirsep Images\dirsep
和../Images/
。
% MainInput.tex
\documentclass{article}
\usepackage{graphicx}
{
\catcode`\^0
\catcode`\\12
^gdef^dirsep{\}
}
\newread\myfile
\newcount\TotalFiles
\makeatletter
\newcommand{\IterateFiles}[3]{%
\immediate\write18{IterateFiles #1 \jobname\space #3}
\openin\myfile=\jobname.list\relax
\loop
\read\myfile to \mydata
\unless\ifeof\myfile
\filename@parse{\mydata}
\section*{\mydata}
\includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{#2\filename@base}
\advance\TotalFiles1\relax
\repeat
\closein\myfile
}
\makeatother
\begin{document}
\IterateFiles{..\dirsep Images\dirsep}{../Images/}{jpg png pdf eps}
\section*{Summary}
There are \the\TotalFiles\ files in total.
\end{document}
我的问题:如何将单个文件路径参数../Images/
(而不是两个参数)传递给上述宏?
答案1
使用xstring
包将 s 替换/
为\
s(或反之亦然):
\StrSubstitute{../Images}{/}{\dirsep}}
答案2
天哪,显然 Windows 命令 shell 也可以解析../Images/
。我不知道这一点。
% MainInput.tex
\documentclass{article}
\usepackage{graphicx}
\newread\myfile
\newcount\TotalFiles
\makeatletter
\newcommand{\IterateFiles}[2]{%
\immediate\write18{IterateFiles #1 \jobname\space #2}
\openin\myfile=\jobname.list\relax
\loop
\read\myfile to \mydata
\unless\ifeof\myfile
\filename@parse{\mydata}
\section*{\mydata}
\includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{#1\filename@base}
\advance\TotalFiles1\relax
\repeat
\closein\myfile
}
\makeatother
\begin{document}
\IterateFiles{../Images/}{jpg png pdf eps}
\section*{Summary}
There are \the\TotalFiles\ files in total.
\end{document}
\filenamb@base
警告:使用而不是时,这里存在一个隐藏的错误\mydata
。如果有相同的文件名但扩展名不同,则只会包含其中一个。有关更详细的解决方案,请参阅如何修剪从外部文件读取的每一行的行尾字符?。