![用于布局一行图像的自定义命令](https://linux22.com/image/383241/%E7%94%A8%E4%BA%8E%E5%B8%83%E5%B1%80%E4%B8%80%E8%A1%8C%E5%9B%BE%E5%83%8F%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4.png)
我正在学习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}