条带中的 N 幅图像

条带中的 N 幅图像

我需要一些东西(一个包、一个宏,无论什么)来获取 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}

笔记:

  1. \manyimages有两个参数。第一个参数是逗号分隔的图像列表。第二个参数是它们之间的间隙空间(总间隙,将分成 n-1 个间隙)。
  2. 代码需要任意大小的真实图像,否则问题就不大了。因此我没有将图形置于演示模式。
  3. 我是 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

一些线性代数表明,最终高度由公式给出

在此处输入图片描述

在哪里是所需的全局宽度,bH是宽度和高度第幅图像(= 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}

在此处输入图片描述

相关内容