用于布局一行图像的自定义命令

用于布局一行图像的自定义命令

我正在学习expl3,为了练习,我创建了一个简单的命令来布置一行图像,以便该行适合一行,并且所有图像具有相同的高度,并且(可选)它们之间有间距。

然而,代码并没有产生我期望的结果:

在此处输入图片描述

看到最后一条规则后面的额外空白(我将 替换\skip_horizontal:N\rule以提高可见性)。但是,如果我将可选间距设置为0pt,它就会起作用,所以我假设我的错误在于数字之间的间距。但我不知道问题出在哪里。

代码如下:

\documentclass{article}

\usepackage{graphicx}
\usepackage[showframe]{geometry}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\LinhaDeFiguras
  { O{\textwidth}
    D(){0pt}
    m }
  {
    \seq_set_from_clist:Nn \l_tmpa_seq { #3 }
    \dim_set:Nn \l_tmpa_dim { - #2 }
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \hbox_set:Nn \l_tmpa_box
          { \includegraphics [height=1cm] { ##1 } }
        \dim_add:Nn \l_tmpa_dim { #2 + \box_wd:N \l_tmpa_box }
      }
    \dim_set:Nn \l_tmpa_dim { 1cm * \dim_ratio:nn { #1 } { \l_tmpa_dim } }
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \includegraphics [height=\l_tmpa_dim] { ##1 }
        \rule { #2 } { #2 }
        % \skip_horizontal:N #2 \scan_stop:
      }
  }
\ExplSyntaxOff

\begin{document}

\noindent
\LinhaDeFiguras(5pt){
  example-image-16x10,
  example-image-10x16,
  example-image,
  example-image-16x9,
  example-image-9x16,
  example-image-golden,
  }

\end{document}

答案1

这个想法很好,但我会从指定宽度中减去必要的空格数,然后根据此计算最终高度。这些空格可以在最后插入图像之间。

我还会为该任务分配特定的变量。

\documentclass{article}

\usepackage{graphicx}
\usepackage[showframe]{geometry}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand\LinhaDeFiguras { O{\textwidth} D(){0pt} m }
  {
    \latexer_lf_main:nnn { #1 } { #2 } { #3 }
  }

\dim_new:N \l_latexer_lf_width_dim
\dim_new:N \l_latexer_lf_height_dim
\dim_new:N \l_latexer_lf_sofar_dim
\seq_new:N \l_latexer_lf_items_seq
\seq_new:N \l_latexer_lf_output_seq
\box_new:N \l_latexer_lf_figure_box

\cs_new_protected:Nn \latexer_lf_main:nnn
  {
    \dim_zero:N \l_latexer_lf_sofar_dim
    \seq_clear:N \l_latexer_lf_output_seq
    \seq_set_from_clist:Nn \l_latexer_lf_items_seq { #3 }
    \dim_set:Nn \l_latexer_lf_width_dim
      { #1 - #2 * (\seq_count:N \l_latexer_lf_items_seq - 1) }
    \seq_map_inline:Nn \l_latexer_lf_items_seq
      {
        \hbox_set:Nn \l_latexer_lf_figure_box
          { \__latexer_lf_image:nn { 1cm } { ##1 } }
        \dim_add:Nn \l_latexer_lf_sofar_dim
          { \box_wd:N \l_latexer_lf_figure_box }
      }
    \dim_set:Nn \l_latexer_lf_height_dim
      { 1cm * \dim_ratio:nn { \l_latexer_lf_width_dim } { \l_latexer_lf_sofar_dim } }
    \seq_map_inline:Nn \l_latexer_lf_items_seq
      {
       \seq_put_right:Nn \l_latexer_lf_output_seq
         { \__latexer_lf_image:nn { \l_latexer_lf_height_dim } { ##1 } }
      }
    \seq_use:Nn \l_latexer_lf_output_seq
      {
        % \rule { #2 } { #2 } % for debugging
        \skip_horizontal:n { #2 }
      }
  }

\cs_new_protected:Nn \__latexer_lf_image:nn
  {
    \includegraphics[height=#1]{#2}
  }
\ExplSyntaxOff

\begin{document}

\noindent
\LinhaDeFiguras(5pt){
  example-image-16x10,
  example-image-10x16,
  example-image,
  example-image-16x9,
  example-image-9x16,
  example-image-golden,
  }

\bigskip

\noindent
\LinhaDeFiguras[8cm](20pt){
  example-image-16x10,
  example-image-10x16,
  example-image,
  example-image-16x9,
  example-image-9x16,
  example-image-golden,
  }

\end{document}

在此处输入图片描述

相关内容