通过编程将多张图片放入多个页面

通过编程将多张图片放入多个页面

我有很多图像,例如

image01.jpg
image02.jpg
...
image80.jpg

我想将这些图像放入文档中,每页 8 幅图像,4 行 2 列(假设这样它们可以放入一页)。如何使用类似\foreach命令的 tex 编程来实现这一点?


我试过

\def\imagelist{
  image01,
  image02,
  ...
  image80
}

\foreach \f in \imagelist{
  \includegraphics[width=0.5\textwidth]{./folder/\f.jpg}%
}

但是在第一张图片之前会有缩进,并且同一行中的两张图片之间会有分离,导致盒子过满。


更新:实际上,如果我可以做嵌套列表,它会更简单,例如

\def\nestedlist{
{image01, image02, ..., image08},
...
}
\foreach \eightimages in \nestedlist{
  \foreach \f in \eightimages{
    % one figure environment
    \begin{figure}
      % 8 images here
    \end{figure}
  }
}

这样我就有更多的控制权。


更新 2024.03.28:根据“如果此答案解决了您的问题或对您找到解决方案最有帮助,请接受此答案”,我选择了使用 lualatex 引擎的答案。其他答案也是有效的解决方案。根据您的需求选择解决方案。它们都有效。

答案1

这是一个基于 LuaLaTeX 的解决方案。每组 8 张图片放置在一个table[p]环境中,以确保页面垂直居中。

% !TEX TS-program = lualatex
\documentclass{article}
%\usepackage[a4paper,margin=2.5cm]{geometry} % set page parameters as needed
\usepackage[demo]{graphicx} % remove 'demo' option in real document

\usepackage{luacode}
\begin{luacode}
function do_80()
  for i=0,9 do   -- outer loop
    tex.sprint ( "\\begin{table}[p]" )
    for j=1,8 do -- inner loop
      ij=string.format ( "%02d" , i*8+j )
      tex.sprint ( "\\includegraphics[width=0.485\\textwidth]{image"..ij..".jpg} \\hfill" )
      if (j%2==0) then
        tex.sprint ( "\\par\\medskip" )
      end
    end
    tex.sprint ( "\\end{table}" )
  end
end
\end{luacode}

\begin{document}
\directlua{do_80()} 
\end{document}

前两页看起来像这样(但请记住demo在实际代码中省略该选项):

在此处输入图片描述

答案2

不久前,我有一个类似的要求,我使用 l3 编程层 clists 来实现。

在此处输入图片描述

我将在几个小时后发布代码,因为我现在要出去了。为什么要使用 clist?您可以选择图像,因为您可能想跳过一些图像。第二个版本更复杂,使用一个函数,可以将图像添加到 imgdb 等。很多年前我用过 LaTeX2e @for。今天,有了 l3 层,人们有了更多更好的选择。

\makeatletter
\def\blist{fig189,fig145,fig161,fig162}
\@for \i:=\blist\do{%
  \expandafter\putgraphic{\i}%
}
\makeatother

为了打破每四幅图像,我将使用一个计数器。

\documentclass{article}
\usepackage[demo]{graphicx}

\begin{document}
\ExplSyntaxOn
\int_new:N \my_counter_int
\cs_set:Npn \put_graphic:n #1 
   { \int_incr:N\my_counter_int
     \int_compare:nNnTF \my_counter_int=4 %par every 4
     { \includegraphics[width=1.5cm]{#1}~\par\int_set:Nn\my_counter_int{0}}
     { 
      \includegraphics[width=1.5cm]{#1}~
     }
   }
   
\clist_set:Nn \imgdb:n {fig145,fig161,fig162,fig163,fig164,fig165,fig166,fig145}

\clist_map_function:NN \imgdb:n \put_graphic:n 
 
\ExplSyntaxOff

\end{document}

可以扩展函数,使其具有键值接口。请注意后面的空格\includegraphics。内联包含的图像只是框,因此,如果您有 50 张代表古汉字的小图像,就可以用它们构建段落!

更改 clist 以包含更多图像(包括xcolor包)并添加\pagecolor{blue!10}计数限制为 8,我得到:

长数字

\usepackage[demo]{graphicx}由于您没有图像,请使用 运行示例。以下是一些提示:

  1. 最好使用具有透明度的 .png 图像,因为您可能希望将它们放在彩色背景上。
  2. 代码可以扩展为添加\labelsubcaption,只需将图形包含在 parbox 中,并使用计数器(int)作为子项。
  3. 始终使用演示和真实图像进行测试。使用真实图像,您可以发现任何未预见到的潜在问题。
  4. 用来\graphicspath查找这些图像,以避免将这些图像与文档中使用的其他图像混合。

锻炼 a) 修改代码以自动从目录中读取所有图像并填充clist。b) 假设所有图像具有相同的前缀,修改代码以包含前缀并适当地填充 clist。c) 修改代码,以便可以说包含fig140-15010 张图像。

答案3

实际上,添加行和列之间的间隙是最困难的部分。

\documentclass{article}
\usepackage{graphicx}
\usepackage{duckuments}
\usepackage{tikz}
\usepackage{showframe}% alignment tool

\def\imagelist{
  example-image/example-image-a,
  example-image-b/example-image-c,
  example-image-duck/example-image-duck,
  example-image-duck/example-image-duck
}
\begin{document}

\begin{figure}[p]
\setlength{\dimen9}{\dimexpr 0.5\textwidth-0.5\columnsep}%
\setlength{\dimen8}{\dimexpr 0.25\textheight-0.75\floatsep}%
\setlength{\lineskip}{\floatsep}%
\foreach \foo/\bar in \imagelist{%
  \includegraphics[width=\dimen9, height=\dimen8]{\foo}\hfill
  \includegraphics[width=\dimen9, height=\dimen8]{\bar}\par
}
\end{figure}

\end{document}

这显示了 paracol 解决方案。虽然您可以将图形放在 paracol 中,但它会为 [p] 浮点数添加一个空白页。

\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{paracol}
\globalcounter*
\usepackage{showframe}% alignment tool

\def\imagelist{
  example-image,
  example-image-a,
  example-image-b,
  example-image-c,
  example-image,
  example-image-a,
  example-image-b,
  example-image-c,  
  example-image,
  example-image-a,
  example-image-b,
  example-image-c,
  example-image,
  example-image-a,
  example-image-b,
  example-image-c
}
\newlength{\rowheight}
\setlength{\rowheight}{\dimexpr 0.25\textheight-0.76\floatsep}% roundoff error

\begin{document}

\begin{paracol}{2}
\parindent=0pt
\lineskip=0pt
\foreach \foo in \imagelist{%
  \includegraphics[width=\columnwidth, height=\rowheight]{\foo}
  \ifnum\thecolumn=0\relax
    \switchcolumn 
  \else
    \switchcolumn*[\vskip\floatsep]
  \fi
}
\end{paracol}
\end{document}

相关内容