我需要一些东西(一个包、一个宏,无论什么)来获取 n 张任意大小的图像并计算它们的高度,以便所有并排的图像精确地填充一列。据我所知,没有这样的包。我找到的最接近的东西是这个:如何定义一个使用图像宽度和高度来定义变量以供以后使用的宏。我修改了那里提供的解决方案以接受任意数量的图像。我把它放在这里希望有人会觉得它有用:
\documentclass{article}
\usepackage{graphicx}
\usepackage{calc}
\usepackage{pgf}
\usepackage{pgffor}
\usepackage{subfig}
\usepackage{lipsum}
\newlength\myheight%
\newlength\mywidth%
\newlength\effwidth%
\newlength\finalheight%
\newlength\gapspace%
\newcommand{\manyimages}[2]{
\setlength{\gapspace}{#2}%
\pgfmathsetlength{\effwidth}{0.99\textwidth - \gapspace}%
\def\sumratio{0}
\foreach \im [remember=\sumratio] in {#1} {%
\def\myimage{\includegraphics{\im}}%
\setlength{\myheight}{\heightof{\myimage}}%
\setlength{\mywidth}{\widthof{\myimage}}%
\pgfmathsetmacro{\myratio}{\mywidth / \myheight}%
\pgfmathsetmacro{\sumratio}{\sumratio+\myratio}
}%
\pgfmathsetlength{\finalheight}{\effwidth / \sumratio}%
}
\begin{document}
\begin{figure}
\begin{centering}
\manyimages{image1, image2, image3, image4}{0.06\textwidth}
\subfloat{\includegraphics[height=\finalheight]{image1}}
\hfill
\subfloat{\includegraphics[height=\finalheight]{image2}}
\hfill
\subfloat{\includegraphics[height=\finalheight]{image3}}
\hfill
\subfloat{\includegraphics[height=\finalheight]{image4}}
\end{centering}
\end{figure}
\lipsum
\end{document}
笔记:
\manyimages
有两个参数。第一个参数是逗号分隔的图像列表。第二个参数是它们之间的间隙空间(总间隙,将分成 n-1 个间隙)。- 代码需要任意大小的真实图像,否则问题就不大了。因此我没有将图形置于演示模式。
- 我是 LaTeX 和 StackExchange 的新手,我很感谢有关最佳实践等的意见。
答案1
当然,由于缺乏睡眠,我误解了这个问题......但你想要的不仅仅是这个?:
\documentclass{article}
\usepackage{graphicx}
\usepackage{lipsum} % dummy text
\begin{document}
\lipsum[2]\bigskip
\noindent\resizebox{\textwidth}{!}{
\includegraphics[height=\textheight]{example-image}
\includegraphics[height=\textheight]{example-image-10x16}
\includegraphics[height=\textheight]{example-image-golden}
\includegraphics[height=\textheight]{example-image-golden-upright}}
\bigskip\lipsum[5]
\end{document}
笔记:我忘记在每张图片后面添加%
,这样图片之间就会有空格。当固定值height
足够大时,结果大致相同,但如果值非常低(例如在本例中尝试),则空间会放大,从而在图片之间产生命令1 mm
的外观。有趣的是,这里只是阻止了这种间距(请不要将此视为替代用法的建议)。 \hfill
\hfill
答案2
一些线性代数表明,最终高度由公式给出
在哪里瓦是所需的全局宽度,b我和H我是宽度和高度我第幅图像(我= 1,2,…,n);*h$ 是最终高度。
使用 的实现expl3
几乎很简单。我猜用 也很容易pgfmath
。宏的\manyimages
第一个参数是所需的宽度(瓦在前面的符号中),可以是任何你想要的。在下面的例子中,我选择0.8\textwidth
给图像留出一些空间。
\documentclass{article}
\usepackage{graphicx}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\manyimages}{ m m }
{
% #1 is the required width
% #2 is a comma separated list of image names
\manyimages_main:nn { #1 } { #2 }
}
\fp_new:N \l_manyimages_temp_fp
\box_new:N \l_manyimages_temp_box
\dim_new:N \l_manyimages_finalheight_dim
\cs_set_eq:NN \finalheight \l_manyimages_finalheight_dim
\cs_new_protected:Npn \manyimages_main:nn #1 #2
{
% clear the storage bin
\fp_zero:N \l_manyimages_temp_fp
\clist_map_inline:nn { #2 }
{
% set a temporary box for measuring the current image
\hbox_set:Nn \l_manyimages_temp_box { \includegraphics{##1} }
% compute the ratio width/height and add it to the storage bin
\fp_add:Nn \l_manyimages_temp_fp
{
\dim_to_fp:n { \box_wd:N \l_manyimages_temp_box }
/
\dim_to_fp:n { \box_ht:N \l_manyimages_temp_box }
}
}
% now set \finalheight to the ratio w/(computed sum)
\dim_set:Nn \l_manyimages_finalheight_dim
{
\fp_to_dim:n { \dim_to_fp:n { #1 } / \l_manyimages_temp_fp }
}
}
\ExplSyntaxOff
\begin{document}
\begin{flushleft}
\manyimages{0.8\textwidth}{
example-image,
example-image-10x16,
example-image-golden,
example-image-golden-upright
}
\includegraphics[height=\finalheight]{example-image}\hfill
\includegraphics[height=\finalheight]{example-image-10x16}\hfill
\includegraphics[height=\finalheight]{example-image-golden}\hfill
\includegraphics[height=\finalheight]{example-image-golden-upright}
\bigskip
For control
\bigskip
\resizebox{\textwidth}{!}{%
\includegraphics{example-image}
\includegraphics{example-image-10x16}
\includegraphics{example-image-golden}
\includegraphics{example-image-golden-upright}%
}
\end{flushleft}
\end{document}
我在套件中使用了一些图像mwe
。第二行仅用于控制,并以(统一缩放的)原始比例显示图像。
这是 的全功能解决方案subfig
。为了排版一行图像,我们使用manysubfloats
包含一个或多个\subimage
命令的环境。 的强制参数manysubfloats
是维度;使用任何你想要的,但请记住使用\textwidth
会将所有图像推到一起。
您可以拥有多个manysubfloats
环境,每个环境都会打印一行子浮点数。
每个\subimage
命令都有两个参数:第一个是可选的键值对列表,第二个是文件名。在键值对中可以指定
file=
用于文件名;path=
对于非标准路径;caption=
用于设置子标题;listcaption=
图表列表中可能存在不同的子标题;label=
用于引用子浮点数的标签。
为什么要使用 key file
?如果文件名包含特殊字符或太长,则强制参数的符号名称是首选。强制参数仅用于内部目的。keyfile=
可能不是必需的,因为大多数情况下文件名都可以安全使用。
\documentclass{article}
\usepackage{graphicx,subfig}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment{manysubfloats}{ m }
{ \clist_clear:N \l_manyimages_row_clist }
{ \manyimages_display:n { #1 } }
\NewDocumentCommand{\subimage}{ O{} m }
{% #1 is a key-value list, #2 is a symbolic name or the file name
\manyimages_subimage:nn { #2 } { #1 }
}
\keys_define:nn { manyimages }
{
file .tl_set:N = \l_manyimages_file_tl,
path .tl_set:N = \l_manyimages_path_tl,
caption .tl_set:N = \l_manyimages_caption_tl,
listcaption .tl_set:N = \l_manyimages_listcaption_tl,
label .tl_set:N = \l_manyimages_label_tl
}
\fp_new:N \l_manyimages_temp_fp
\box_new:N \l_manyimages_temp_box
\dim_new:N \l_manyimages_finalheight_dim
\clist_new:N \l_manyimages_row_clist
\tl_new:N \l_manyimages_output_tl
\tl_new:N \l_manyimages_tmpa_tl
\tl_new:N \l_manyimages_tmpb_tl
% a constant property list
\prop_new:N \c_manyimages_proto_prop
\prop_gput:Nnn \c_manyimages_proto_prop { file } { }
\prop_gput:Nnn \c_manyimages_proto_prop { path } { }
\prop_gput:Nnn \c_manyimages_proto_prop { caption } { }
\prop_gput:Nnn \c_manyimages_proto_prop { listcaption } { }
\prop_gput:Nnn \c_manyimages_proto_prop { label } { }
\cs_new_protected:Npn \manyimages_main:n #1
{
% clear the storage bin
\fp_zero:N \l_manyimages_temp_fp
\clist_map_inline:Nn \l_manyimages_row_clist
{
% set a temporary box for measuring the current image
\__manyimages_prop_get:nnN { ##1 } { path } \l_manyimages_tmpa_tl
\__manyimages_prop_get:nnN { ##1 } { file } \l_manyimages_tmpb_tl
\hbox_set:Nn \l_manyimages_temp_box
{
\includegraphics
{
\tl_if_empty:NF \l_manyimages_tmpa_tl { \l_manyimages_tmpa_tl / }
\l_manyimages_tmpb_tl
}
}
% compute the ratio width/height and add it to the storage bin
\fp_add:Nn \l_manyimages_temp_fp
{
\dim_to_fp:n { \box_wd:N \l_manyimages_temp_box }
/
\dim_to_fp:n { \box_ht:N \l_manyimages_temp_box }
}
}
% now set \finalheight to the ratio w/(computed sum)
\dim_set:Nn \l_manyimages_finalheight_dim
{
\fp_to_dim:n { \dim_to_fp:n { #1 } / \l_manyimages_temp_fp }
}
}
\cs_new_protected:Npn \manyimages_subimage:nn #1 #2
{% add the item to the clist
\clist_put_right:Nn \l_manyimages_row_clist { #1 }
% clear the property list for #1 (symbolic name or file name)
\prop_clear_new:c { l_manyimages_\tl_to_str:n { #1 }_prop }
% fill in the property list with empty values
\prop_set_eq:cN { l_manyimages_\tl_to_str:n { #1 }_prop } \c_manyimages_proto_prop
\keys_set:nn { manyimages }
{% empty the variables and evaluate the given ones
file = {},
path = {},
caption = {},
listcaption = {},
label = {},
#2
}
\tl_if_empty:NTF \l_manyimages_file_tl
{
\__manyimages_prop_put:nnn { #1 } { file } { #1 }
}
{
\__manyimages_prop_put:nnV { #1 } { file } \l_manyimages_file_tl
}
\__manyimages_prop_put:nnV { #1 } { path } \l_manyimages_path_tl
\__manyimages_prop_put:nnV { #1 } { caption } \l_manyimages_caption_tl
\__manyimages_prop_put:nnV { #1 } { listcaption } \l_manyimages_listcaption_tl
\__manyimages_prop_put:nnV { #1 } { label } \l_manyimages_label_tl
}
%%% syntactic sugar
% a personal version of \prop_put:cnn
\cs_new_protected:Npn \__manyimages_prop_put:nnn #1 #2 #3
{
\prop_put:cnn { l_manyimages_\tl_to_str:n { #1 }_prop } { #2 } { #3 }
}
\cs_generate_variant:Nn \__manyimages_prop_put:nnn { nnV }
% a personal version of \prop_get:cnN
\cs_new_protected:Npn \__manyimages_prop_get:nnN #1 #2 #3
{
\prop_get:cnN { l_manyimages_\tl_to_str:n { #1 }_prop } { #2 } #3
}
%%% use \subfloat
\cs_new_protected:Npn \manyimages_display:n #1
{% compute the final height
\manyimages_main:n { #1 }
% output the subfloats
\clist_map_inline:Nn \l_manyimages_row_clist
{
\tl_set:Nn \l_manyimages_output_tl { \subfloat }
\__manyimages_prop_get:nnN { ##1 } { listcaption } \l_tmpa_tl
\tl_if_empty:NF \l_tmpa_tl
{
\tl_put_right:Nn \l_manyimages_output_tl { [ }
\tl_put_right:NV \l_manyimages_output_tl \l_tmpa_tl
\tl_put_right:Nn \l_manyimages_output_tl { ] }
}
\__manyimages_prop_get:nnN { ##1 } { caption } \l_tmpa_tl
\tl_put_right:Nn \l_manyimages_output_tl { [ }
\tl_if_empty:NF \l_tmpa_tl
{
\tl_put_right:NV \l_manyimages_output_tl \l_tmpa_tl
}
\tl_put_right:Nn \l_manyimages_output_tl { ] }
\__manyimages_prop_get:nnN { ##1 } { label } \l_tmpa_tl
\__manyimages_prop_get:nnN { ##1 } { path } \l_manyimages_tmpa_tl
\__manyimages_prop_get:nnN { ##1 } { file } \l_manyimages_tmpb_tl
\tl_put_right:Nx \l_manyimages_output_tl
{
{
\exp_not:N \includegraphics
[height=\l_manyimages_finalheight_dim]
{
\tl_if_empty:NF \l_manyimages_tmpa_tl { \l_manyimages_tmpa_tl / }
\l_manyimages_tmpb_tl
}
\tl_if_empty:NF \l_tmpa_tl { \exp_not:N \label { \l_tmpa_tl } }
}
}
\tl_use:N \l_manyimages_output_tl\hfill
}
\unskip
}
\ExplSyntaxOff
\setcounter{lofdepth}{2}
\begin{document}
\listoffigures
\begin{figure}[htp]
\centering
\begin{manysubfloats}{.9\textwidth}
\subimage{example-image}
\subimage[
file=example-image-10x16
]{10x16}
\subimage[
caption=Yikes,
listcaption=Ouch,
path=images
]{example-image-golden}
\subimage[
label=subfig:upright
]{example-image-golden-upright}
\end{manysubfloats}
\caption{Cumulative caption}
\end{figure}
A reference: \subref{subfig:upright}
\end{document}