我有很多图像,例如
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}
由于您没有图像,请使用 运行示例。以下是一些提示:
- 最好使用具有透明度的 .png 图像,因为您可能希望将它们放在彩色背景上。
- 代码可以扩展为添加
\label
和subcaption
,只需将图形包含在 parbox 中,并使用计数器(int)作为子项。 - 始终使用演示和真实图像进行测试。使用真实图像,您可以发现任何未预见到的潜在问题。
- 用来
\graphicspath
查找这些图像,以避免将这些图像与文档中使用的其他图像混合。
锻炼
a) 修改代码以自动从目录中读取所有图像并填充clist
。b) 假设所有图像具有相同的前缀,修改代码以包含前缀并适当地填充 clist。c) 修改代码,以便可以说包含fig140-150
10 张图像。
答案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}