如何在不知道文件名的情况下将文件从某个文件夹放入我的 TeX 文件中?

如何在不知道文件名的情况下将文件从某个文件夹放入我的 TeX 文件中?

我有一个包含几百张图的文件夹(其中只有数字):我怎样才能将它们全部导入到我的tex文件中不知道文件名在类似的代码中\includegraphics{filename}(使用LuaLaTeX

我想将文件名作为标题。

一般 MWE:

\documentclass{article}
\usepackage{graphicx,caption}
%folder for the figures is `/figures/`

\begin{document}
%repeat from here for each file in folder `figures`
\begin{figure}[!htb]
\includegraphics[scale=1]{figures/`filename`}
\caption{`filename`}
\end{figure}
\end{document}

答案1

如果你安装了 Java,你可以使用texosquery使用 TeX 的管道 shell 转义。以下假设您的所有图像文件都具有扩展名.png

\documentclass{article}
\usepackage{graphicx,caption}
\usepackage{texosquery}% requires piped shell escape

\makeatletter

% syntax: \foreachfile{cs}{pattern}{folder}{body}
\newcommand{\foreachfile}[4]{%
  \TeXOSQueryFilterFileList{\result}{,}{#2}{#3}%
  \ifx\result\empty
    Query failed!
  \else
   \@for#1:=\result\do{#4}%
  \fi
}

\makeatother

\begin{document}
\foreachfile{\thisimage}{.*\string\.png}{figures}
{
  \begin{figure}[!htb]
  \edef\x{\noexpand\includegraphics[scale=1]{figures/\thisimage}}\x
  \caption{\thisimage}
  \end{figure}
}
\end{document}

这需要启用 shell escape。例如:

pdflatex -shell-escape mydoc

(文件名为mydoc.tex)。如果您使用 MiKTeX,您还需要使用--enable-pipes。如果您使用texosqueryv1.3 或更低版本的 LuaTeX,您还需要使用 手动关闭试运行模式\TeXOSQueryDryRunfalse。v1.4 不需要此操作。

texosquery使用前需要进行一些设置。应该有一个名为的配置文件texosquery.cfg,可以通过以下方式找到:

kpsewhich texosquery.cfg

(从命令行运行)。最好将此文件复制到您的TEXMFLOCALTEXMFHOME树中,以防止每次升级软件包时您的更改被覆盖。

找出你使用的 Java 版本。(从你的评论中我猜你使用的是 Java 5。)可以使用以下命令找到版本号

java -version

例如,对我来说,这显示java version "1.8.0_92"意味着 Java 8。

如果你使用的是 Java 5 或 6,则该texosquery.cfg文件需要包含以下行

\def\TeXOSInvokerName{texosquery-jre5}

\TeXOSQueryAllowRestricted必须注释掉带有 的行。

如果你使用的是 Java 7,则该texosquery.cfg文件需要包含以下行

\def\TeXOSInvokerName{texosquery}

\TeXOSQueryAllowRestricted并且,再次强调,必须注释掉带有 的行。这是默认配置。

如果你使用的是 Java 8,则该texosquery.cfg文件需要包含以下行

\def\TeXOSInvokerName{texosquery-jre8}

该应用程序的此形式已添加到 TeX Live 2017 的限制列表中,因此如果您有 TL2017,则可以取消注释\TeXOSQueryAllowRestricted,否则需要保持注释掉。

texosquery-jre8限制列表仅评估了 Java 8 版本 ( ),因为旧版本的 Java 被视为安全风险。

注意:对于texosqueryv1.3 及以下版本,您无法\TeXOSQueryFilterFileList在受限模式下使用(但可以与不受限制的 shell 转义一起使用)。版本 1.4 允许这样做,但受限模式的安全功能会施加一些限制。

答案2

或许它并不完全符合你的期望,但它可以作为一个开始。

示例 1: 以下示例使用tikz包裹:

\documentclass[a4paper]{report}
\usepackage{tikz}
\usepackage{graphicx}

\begin{document}
    \def \n {3} % change this to the amount of files you need to include.
     \foreach \s in {0,...,\n} {%
       \begin{figure}
        \centering
        \includegraphics[scale=0.5]{figures/\s.png}
        \caption{This is figure \s}
       \end{figure}
    }
\end{document}

值得注意的是,图形需要有数字名称。

示例 2: 第二个例子取自如何迭代文件夹中文件的名称

\documentclass{article}
\makeatletter
\def\app@exe{\immediate\write18}
\def\inputAllFiles#1{%
  \app@exe{ls #1/*.txt | xargs cat >> \jobname.tmp}%
  \InputIfFileExists{\jobname.tmp}{}
  \AtEndDocument{\app@exe{rm -f #1/\jobname.tmp}}}
\makeatother
\begin{document}

\inputAllFiles{figures/.}% from the figures dir 

\end{document}

需要注意的是,你需要使用pdflatex -shell-escape test

相关内容