2019 年更新

2019 年更新

我的工作目录中有一组图片,我想使用这些图片制作 PDF 报告。我想包含所有图片,但图片数量在每种情况下都会发生变化。我想制作一个“for”循环,按顺序逐张插入每张图片。有人能帮我吗?目前我的代码如下:

\begin{figure}[h!]
\begin{centering}
\includegraphics[width=10cm,height=10cm]{Figure1.png}
\caption[Sèries temporals de vent i direccions]{Sèries temporals velocitat de vent i     direccions. filtratge de pics i glaçades de velocitat.}
\label{Serie}
\end{centering}

\end{figure}

我想对.png目录中的每一张图片都这样做。感谢您的提问:我使用的是 Windows 7,文件名遵循 Figura1.png、Figura2.png 等模式。那么哪种可能性最合适?

答案1

假设您的图片都遵循某些命名约定(这里我使用pic1.pngpic4.png),该lipsum包仅用于虚拟文本:

\documentclass[parskip]{scrartcl}
\usepackage[margin=10mm,a6paper]{geometry}
\usepackage{tikz}
\usepackage{lipsum}

\begin{document}

\foreach \x in {1,2,3,4}
{ \lipsum[\x]
    \includegraphics[scale=1]{pic\x.png}
    \clearpage
}

\end{document}

或者,您可以指定要迭代的变量元组。以下代码效果相同:

\foreach \x/\picname in {4/pic1.png,8/pic2.png,15/pic3.png,16/pic4.png}
{ \lipsum[\x]
    \begin{figure}[htb]
        \includegraphics[scale=1]{\picname}
        \caption{The very nice picture \x}
    \end{figure}
    \clearpage
}

输出为:

在此处输入图片描述

答案2

使用精彩python.sty包(参见github) 和一些嵌入式 Python 代码,这很容易:

\documentclass{article}

\usepackage{python}
\usepackage{graphicx}

\begin{document}

\begin{python}
import os
directory = "."
extension = ".png"
files = [file for file in os.listdir(directory) if file.lower().endswith(extension)]

for file in files:
   print r"\begin{figure}[!ht]"
   print r"\centering"
   print r"\includegraphics[width=10cm,height=10cm]{%s}" % file
   print r"\caption{File %s}" % file
   print r"\label{Serie}"
   print r"\end{figure}"
\end{python}

\end{document}

请注意,您需要使用该--enable-write18选项进行编译才能运行 Python 代码。

答案3

如果你的系统是 Unix 系统,那么下面的一组宏就可以了,但它们要求使用以下命令编译文件pdflatex -shell-escape

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[catalan]{babel}
\usepackage{graphicx}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\figureloop}{m}
 {
  \group_begin:
  \etex_everyeof:D { \exp_not:N }
  \tex_endlinechar:D \c_minus_one
  \seq_gset_split:Nnx \g_figloop_names_seq { , }
    { \tex_input:D |"ls ~ -m ~ #1*.png" ~}
  \group_end:
  \seq_map_inline:Nn \g_figloop_names_seq { \dofigureloop { ##1 } }
 }
\cs_generate_variant:Nn \seq_gset_split:Nnn {Nnx}
\seq_new:N \g_figloop_names_seq
\ExplSyntaxOff

\NewDocumentCommand \dofigureloop {m}
 {
  \begin{figure}
  \centering
  \includegraphics[width=10cm,height=10cm]{#1}
  \caption[Sèries temporals de vent i direccions]
          {Sèries temporals velocitat de vent i direccions. Filtratge de pics i glaçades de velocitat.}
  \label{Serie-#1}
  \end{figure}
 }

\begin{document}

\figureloop{figure}

\end{document}

参数\figureloop是图形名称中的通用部分。它可能被推广到不同的扩展。

该位将通过 shell-escape 发送到操作系统的命令\tex_input:D |"ls~-m~#1*.png"~的输出加载到操作系统。此输出存储在一个序列中,然后将其拆分。然后在该序列上调用一个映射函数,其参数就是一个文件名,调用的宏只是排版必要的图形环境。还会生成ls表单中的标签。Serie-<filename>

使用不同的 shell 命令这也可能适用于 Windows 系统。


无论如何都需要一个更简单的版本-shell-escape;使用kpsewhich应该确保它可以在 Windows 系统上执行。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[catalan]{babel}
\usepackage{graphicx}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\figureloop}{m}
 {
  \jonel_figureloop:n { #1 }
 }

\ior_new:N \g_jonel_ls_stream

\seq_new:N \l_jonel_filenames_seq

\cs_new_protected:Npn \jonel_figureloop:n #1
 {
  \seq_clear:N \l_jonel_filenames_seq
  \ior_open:Nn \g_jonel_ls_stream { "|kpsewhich ~ #1*.png" }
  \ior_map_inline:Nn \g_jonel_ls_stream
   { \seq_put_right:Nf \l_jonel_filenames_seq { \tl_trim_spaces:n { ##1 } } }
  \seq_map_inline:Nn \l_jonel_filenames_seq { \dofigureloop { ##1 } }
 }
\cs_generate_variant:Nn \seq_put_right:Nn {Nf}
\ExplSyntaxOff

\NewDocumentCommand \dofigureloop {m}
 {
  \begin{figure}
  \centering
  \includegraphics[width=10cm,height=10cm]{#1}
  \caption[Sèries temporals de vent i direccions]
          {Sèries temporals velocitat de vent i direccions. 
           Filtratge de pics i glaçades de velocitat.}
  \label{Serie-#1}
  \end{figure}
 }


\begin{document}

% assume all figures are in the "figures" subfolder
% and are named "figureXXX.png"

\figureloop{figures/figure}

\end{document}

2019 年更新

由于 的变更expl3,先前的解决方案将不再有效。这是新版本。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[catalan]{babel}
\usepackage{graphicx}
\usepackage{xparse}
\usepackage{showlabels}

\ExplSyntaxOn
\NewDocumentCommand{\figureloop}{O{png}mm}
 {
  \jonel_figureloop:nnn { #1 } { #2 } { #3 }
 }


\tl_new:N \l_jonel_filenames_tl
\seq_new:N \l_jonel_filenames_seq
\cs_new_protected:Nn \__jonel_filenames_process:nn {}
\cs_generate_variant:Nn \__jonel_filenames_process:nn { VV }

\cs_new_protected:Nn \jonel_figureloop:nnn
 {
  \sys_shell_get:nnN { kpsewhich ~ #2*.#1 } {} \l_jonel_filenames_tl
  \seq_set_split:NnV \l_jonel_filenames_seq { ~ } \l_jonel_filenames_tl
  \seq_pop_right:NN \l_jonel_filenames_seq \l_tmpa_tl
  \cs_set_protected:Nn \__jonel_filenames_process:nn { #3 }
  \seq_map_variable:NNn \l_jonel_filenames_seq \l__jonel_filenames_fullname_tl
   {
    \tl_set_eq:NN \l__jonel_filenames_shortname_tl \l__jonel_filenames_fullname_tl
    \tl_remove_once:Nn \l__jonel_filenames_shortname_tl { ./#2 }
    \tl_remove_once:Nn \l__jonel_filenames_shortname_tl { .#1 }
    \__jonel_filenames_process:VV \l__jonel_filenames_fullname_tl \l__jonel_filenames_shortname_tl
   }
 }
\ExplSyntaxOff

\begin{document}

% assume all figures are in the "figures" subfolder
% and are named "figureXXX.png"

\figureloop{figures/ScreenShot}{
  \begin{figure}
  \centering
\showtokens{\#1=#1,\#2=#2}
  \includegraphics[width=10cm,height=10cm,keepaspectratio]{#1}
  \caption[Sèries temporals de vent i direccions]
          {Sèries temporals velocitat de vent i direccions. 
           Filtratge de pics i glaçades de velocitat.}
  \label{Serie-#2}
  \end{figure}
 }


\end{document}

在此处输入图片描述

答案4

使用 编译以下内容pdflatex -shell-escape filename.tex。仅适用于 Windows 用户。

% filename.tex

\documentclass[preview,border=12pt,varwidth]{standalone}
\usepackage{graphicx}
\edef\subdir{"Sub Dir/"}

\graphicspath{{\subdir}}
\immediate\write18{cmd /c dir /b \subdir\space *.png > imagelist.txt}

\begin{document}
\makeatletter
\newread\reader
\openin\reader=imagelist.txt\relax
\begingroup
\endlinechar=-1\relax
\loop
    \readline\reader to \data
    \unless\ifeof\reader
            \filename@parse{\data}  
            \section{\filename@base.\filename@ext}
            \includegraphics[scale=.5,ext=.\filename@ext]{"\filename@base"}\endgraf
\repeat
\endgroup
\closein\reader
\makeatother
\end{document}

特征

  • 它可以接受文件名或路径中的空格。
  • 它可以从任何子目录导入图像。

相关内容