以下 MWE(至少运行两次)在其第2页(顺便说一下,其数量是不可见的)指出(pdfpages
)\includepdf
文件的高度似乎没有被考虑在内。
你知道发生了什么吗?
% File to be included
\begin{filecontents}{\jobname-bis.tex}
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{mwe}
\usepackage[a4paper]{geometry}
\usepackage{babel}
\begin{document}
\lipsum[1-6]
\end{document}
\end{filecontents}
%
% Main file
\documentclass{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[a4paper]{geometry}
\usepackage[draft]{pdfpages}
\usepackage{mwe}
\usepackage{babel}
%
\begin{document}
\chapter{Foo foo foo foo foo foo foo foo foo foo foo foo foo}
\begin{figure}[hb]
\includegraphics[scale=0.425]{example-image-a4}
\end{figure}
\chapter{Foo foo foo foo foo foo foo foo foo foo foo foo foo}
\IfFileExists{\jobname-bis.pdf}{%
\begin{figure}[hb]
\includepdf[scale=0.425,frame]{\jobname-bis}
\end{figure}
}{%
}
\end{document}
编辑
在实际使用情况下,(pdfpages
)\includepdf
是必要的,因为多个页面.pdf
应该包含在同一个浮动中。
答案1
我不知道下面的是否能满足你的需求。我记不太清pdfpages
楚的语法和行为(我只用过一次),也懒得去查。
以下定义了新的宏\multpages
。它接受一个可选参数和一个强制参数。强制参数是应从中获取页面的文件。可选参数具有以下选项:
pages
:要包含的页面列表,它应该是一个以逗号分隔的列表,可以包含范围nup
:图片的排列方式。它可以是一个数字,用于设置水平方向并排显示的页数,页数后跟换行符,也可以是与模式匹配的内容AxB
。在本例中,图片 A 水平并排显示,图片 B 垂直并排显示。图片的最大宽度为hsize
除以水平排列的图片数(考虑内边距),最大高度为vsize
除以垂直排列的图片数(考虑内边距)。但是,图片周围没有强制使用方框,可能会意外换行或分页。AxB 的乘积不必大于或等于所包含的页数。hpad
:图片之间的水平方向填充。最外侧不应用任何填充。vpad
:图片之间的垂直方向填充。最外侧不应用填充。hsize
:水平可用空间。如果不指定,\textwidth
则将使用当前空间。vsize
:垂直可用空间。如果不指定,则使用当前空间。如果不包含垂直部分,则\textheight
无效。nup
每个未知密钥都会被转发到底层\includegraphics
命令。
编辑更改:
hpad
并且vpad
现在跳过不再暗淡,因此它们接受胶水作为参数。pages
模式-B
现在的范围从 1 开始,A-
现在是直到要包含的 pdf 最后一页的范围。
edit2 所做的更改:
hcor
和vcor
键,允许对高度和宽度的计算进行细微调整(代替固定值.1pt
,最初设置为 0pt)- 图像阵列后的垂直空间较小,导致字幕位置与单个
\includegraphics
- 有无一致的垂直空间
\centering
- 通过定义更多函数并重用函数(而不是代码块)来删除重复的代码并更加模块化
edit3 所做的更改:
hboxed
true
关键:是在表示在每行数字周围放置一个水平框,fixed
表示将该行放入一个宽度固定的框中hsize
, 和false
表示不加框之间进行选择vboxed
true
关键:也可以在、fixed
和之间进行选择false
,其含义相同,但垂直框围绕着整个数组\noindent
被强制置于数组之前,你可以使用nonoindent
键来抑制它
edit4 所做的更改:
pages
右侧无限范围现在也适用于 LuaTeX 和 XeTeX。
已知的问题:
- 垂直高度与指定的不匹配
vsize
,对于多行来说它往往较大,对于一行来说它往往较小(就我目前遇到的情况而言)。结果vboxed=fixed
导致最低行与\vbox
下方重叠。到目前为止,我不知道是什么原因造成的。
已知问题(如果hboxed=false
)
- 对于环境中的某些选项组合,
figure
宽度似乎有点太宽,数字过早地被折断 - 换行符可能会根据
\centering
是否存在而改变
\centering
如果我不使用垂直nup
参数和 no ,我就不会使用hsize
,因为在这种情况下结果总是采用整个文本宽度,并且不需要居中输出,但它可能会导致意外的换行符。
或许将单行装箱会更好\hbox
,但我不知道是否愿意花时间改变输出循环来测试这一点。
代码:
\documentclass[]{article}
\usepackage{showframe}% for debugging
\usepackage{graphicx}
\usepackage{xparse}
\ExplSyntaxOn
\clist_new:N \g_DenisBitouze_pages_clist
\clist_new:N \l_DenisBitouze_tmp_clist
\dim_new:N \l_DenisBitouze_hsize_dim
\dim_new:N \l_DenisBitouze_vsize_dim
\skip_new:N \l_DenisBitouze_tmp_skip
\int_new:N \l_DenisBitouze_hnup_int
\int_new:N \l_DenisBitouze_vnup_int
\int_new:N \l_DenisBitouze_tmp_int
\tl_new:N \l_DenisBitouze_tmp_tl
\tl_new:N \l_DenisBitouze_graphicx_opt_tl
\cs_new_protected:Nn \DenisBitouze_not_hboxed:n { #1 }
\keys_define:nn { DenisBitouze }%>>>
{
,pages .tl_set:N = \l_DenisBitouze_pages_tl
,nup .tl_set:N = \l_DenisBitouze_nup_tl
,hpad .skip_set:N = \l_DenisBitouze_hpad_skip
,hpad .initial:n = 1em
,vpad .skip_set:N = \l_DenisBitouze_vpad_skip
,vpad .initial:n = 1em
,hsize .dim_set:N = \l_DenisBitouze_hsize_available_dim
,hsize .default:n = \textwidth
,vsize .dim_set:N = \l_DenisBitouze_vsize_available_dim
,vsize .default:n = \textheight
,hcorrection .dim_set:N = \l_DenisBitouze_hcor_dim
,hcorrection .initial:n = 0pt
,hcor .meta:n = { hcorrection = #1 }
,vcorrection .dim_set:N = \l_DenisBitouze_vcor_dim
,vcorrection .initial:n = 0pt
,vcor .meta:n = { vcorrection = #1 }
,vboxed .choice:
,vboxed / true .code:n =
\cs_set_protected:Nn \DenisBitouze_vbox:n { \vbox:n { ##1 } }
,vboxed / false .code:n =
\cs_set_protected:Nn \DenisBitouze_vbox:n { ##1 }
,vboxed / fixed .code:n =
\cs_set_protected:Nn \DenisBitouze_vbox:n
{ \vbox_to_ht:nn { \l_DenisBitouze_vsize_available_dim } { ##1 } }
,vboxed .default:n = true
,vboxed .initial:n = true
,hboxed .choice:
,hboxed / true .code:n =
\cs_set_eq:NN \DenisBitouze_hbox:n \hbox:n
,hboxed / false .code:n =
\cs_set_eq:NN \DenisBitouze_hbox:n \DenisBitouze_not_hboxed:n
,hboxed / fixed .code:n =
\cs_set_protected:Nn \DenisBitouze_hbox:n
{ \hbox_to_wd:nn { \l_DenisBitouze_hsize_available_dim } { ##1 } }
,hboxed .default:n = true
,hboxed .initial:n = true
,nonoindent .bool_set:N = \l_DenisBitouze_no_noindent_bool
,nonoindent .default:n = true
,unknown .code:n =
{
\tl_put_right:NV \l_DenisBitouze_graphicx_opt_tl \l_keys_key_tl
\tl_if_empty:nF { #1 }
{ \tl_put_right:Nn \l_DenisBitouze_graphicx_opt_tl { =#1 } }
\tl_put_right:Nn \l_DenisBitouze_graphicx_opt_tl { , }
}
}%<<<
\cs_new_protected:Nn \DenisBitouze_store_pages_count:n%>>>
{
\group_end:
\cs_set:Nn \DenisBitouze_pages_count: { #1 }
}%<<<
\cs_generate_variant:Nn \DenisBitouze_store_pages_count:n { x }
\cs_new_protected:Nn \DenisBitouze_define_count_pages:nn%>>>
{
\cs_set_protected:Nn \DenisBitouze_count_pages:n
{
\group_begin:
#1
\DenisBitouze_store_pages_count:x { #2 }
}
}%<<<
\sys_if_engine_pdftex:T%>>>
{
\DenisBitouze_define_count_pages:nn
{ \pdfximage { #1 } }
{ \the\pdflastximagepages }
}%<<<
\sys_if_engine_luatex:T%>>>
{
\DenisBitouze_define_count_pages:nn
{ \saveimageresource { #1 } }
{ \the\lastsavedimageresourcepages }
}%<<<
\sys_if_engine_xetex:T%>>>
{
\DenisBitouze_define_count_pages:nn
{}
{ \the\XeTeXpdfpagecount #1 \relax }
}%<<<
\cs_new:Nn \DenisBitouze_recall_parse:nnn%>>>
{
\DenisBitouze_parse_range:w #1 - #2 \q_stop { #3 }
}%<<<
\cs_generate_variant:Nn \DenisBitouze_recall_parse:nnn { nxn }
\cs_new_protected:Npn \DenisBitouze_parse_range:w #1-#2\q_stop#3%>>>
{
\tl_if_blank:nTF { #1 }
{
\DenisBitouze_parse_range:w 1-#2\q_stop { #3 }
}
{
\tl_if_blank:nTF { #2 }
{
\tl_if_in:nnTF { #3 } { .pdf }
{ \DenisBitouze_count_pages:n { #3 } }
{ \DenisBitouze_count_pages:n { #3.pdf } }
\DenisBitouze_recall_parse:nxn
{ #1 } { \DenisBitouze_pages_count: } { #3 }
}
{
\int_step_inline:nnn { #1 } { #2 }
{
\clist_gput_right:Nn \g_DenisBitouze_pages_clist { ##1 }
}
}
}
}%<<<
\cs_new_protected:Nn \DenisBitouze_parse_pages:n%>>>
{
\clist_gclear:N \g_DenisBitouze_pages_clist
\clist_set:NV \l_DenisBitouze_tmp_clist \l_DenisBitouze_pages_tl
\clist_map_inline:Nn \l_DenisBitouze_tmp_clist
{
\tl_if_in:nnTF { ##1 } { - }
{
\DenisBitouze_parse_range:w ##1 \q_stop { #1 }
}
{
\clist_gput_right:Nn \g_DenisBitouze_pages_clist { ##1 }
}
}
}%<<<
\cs_new_protected:Npn \DenisBitouze_parse_nup_x:w #1x#2\q_stop%>>>
{
\int_set:Nn \l_DenisBitouze_hnup_int { #1 }
\int_set:Nn \l_DenisBitouze_vnup_int { #2 }
}%<<<
\cs_new_protected:Nn \DenisBitouze_parse_nup:n%>>>
{
\tl_if_empty:nTF { #1 }
{
\int_set:Nn \l_DenisBitouze_hnup_int { \c_one }
\int_set:Nn \l_DenisBitouze_vnup_int { \c_zero }
}
{
\tl_if_in:nnTF { #1 } { x }
{
\DenisBitouze_parse_nup_x:w #1 \q_stop
}
{
\int_set:Nn \l_DenisBitouze_hnup_int { #1 }
\int_set:Nn \l_DenisBitouze_vnup_int { \c_zero }
}
}
}%<<<
\cs_generate_variant:Nn \DenisBitouze_parse_nup:n { V }
\cs_new_protected:Nn \DenisBitouze_output_single:nnn%>>>
{
\includegraphics [ #1, #2 ] { #3 }
}%<<<
\cs_generate_variant:Nn \DenisBitouze_output_single:nnn { nVn }
\cs_new_protected:Nn \DenisBitouze_output_single_no_vnup:nn%>>>
{
\DenisBitouze_output_single:nVn
{ width=\l_DenisBitouze_hsize_dim, page=#1 }
\l_DenisBitouze_graphicx_opt_tl
{ #2 }
}%<<<
\cs_new_protected:Nn \DenisBitouze_output_single_with_vnup:nn%>>>
{
\DenisBitouze_output_single:nVn
{
width=\l_DenisBitouze_hsize_dim,
height=\l_DenisBitouze_vsize_dim,
keepaspectratio=true,
page = #1
}
\l_DenisBitouze_graphicx_opt_tl
{ #2 }
}%<<<
\cs_generate_variant:Nn \DenisBitouze_output_single_no_vnup:nn { V }
\cs_generate_variant:Nn \DenisBitouze_output_single_with_vnup:nn { V }
\cs_new_protected:Nn \DenisBitouze_calc_hsize:%>>>
{
\dim_set:Nn \l_DenisBitouze_hsize_dim
{
(
\l_DenisBitouze_hsize_available_dim
+ \l_DenisBitouze_hpad_skip
)
/ \l_DenisBitouze_hnup_int
- \l_DenisBitouze_hpad_skip
% rounding could lead to too much horizontal space taken without
% this in a figure environment
- \l_DenisBitouze_hcor_dim
}
}%<<<
\cs_new_protected:Nn \DenisBitouze_calc_vsize:%>>>
{
\dim_set:Nn \l_DenisBitouze_vsize_dim
{
(
\l_DenisBitouze_vsize_available_dim
+ \l_DenisBitouze_vpad_skip
)
/ \l_DenisBitouze_vnup_int
- \l_DenisBitouze_vpad_skip
- \l_DenisBitouze_vcor_dim
}
}%<<<
\cs_new_protected:Nn \DenisBitouze_output_line:Nn%>>>
{
\int_step_inline:nn { \l_DenisBitouze_hnup_int }
{
\clist_if_empty:NF \g_DenisBitouze_pages_clist
{
\clist_gpop:NN \g_DenisBitouze_pages_clist \l_DenisBitouze_tmp_tl
#1 \l_DenisBitouze_tmp_tl { #2 }
\skip_horizontal:N \l_DenisBitouze_hpad_skip
}
}
\skip_horizontal:n { -\l_DenisBitouze_hpad_skip }
}%<<<
\cs_new_protected:Nn \DenisBitouze_output_loop:Nn%>>>
{
\bool_do_while:nn { !\clist_if_empty_p:N \g_DenisBitouze_pages_clist }
{
\bool_if:NF \l_DenisBitouze_no_noindent_bool { \noindent }
\mbox{}
\DenisBitouze_hbox:n { \DenisBitouze_output_line:Nn #1 { #2 } }
\mbox{}
\skip_vertical:N \l_DenisBitouze_vpad_skip
}
}%<<<
\cs_new_protected:Nn \DenisBitouze_after_loop:%>>>
{
\skip_vertical:n { - \l_DenisBitouze_vpad_skip }
}%<<<
\cs_new_protected:Nn \DenisBitouze_output_no_vnup:n%>>>
{
\DenisBitouze_output_loop:Nn
\DenisBitouze_output_single_no_vnup:Vn { #1 }
}%<<<
\cs_new_protected:Nn \DenisBitouze_output_with_vnup:n%>>>
{
\DenisBitouze_calc_vsize:
\DenisBitouze_output_loop:Nn
\DenisBitouze_output_single_with_vnup:Vn { #1 }
}%<<<
\NewDocumentCommand \multpages { O{} m }%>>>
{
\group_begin:
\keys_set:nn { DenisBitouze } { hsize, vsize, #1 }
\DenisBitouze_parse_pages:n { #2 }
\clist_if_empty:NT \g_DenisBitouze_pages_clist
{
\clist_gset:Nn \g_DenisBitouze_pages_clist { \c_one }
}
\DenisBitouze_parse_nup:V \l_DenisBitouze_nup_tl
\DenisBitouze_calc_hsize:
\DenisBitouze_vbox:n
{
\int_compare:nNnTF { \l_DenisBitouze_vnup_int } = { \c_zero }
{ \DenisBitouze_output_no_vnup:n { #2 } }
{ \DenisBitouze_output_with_vnup:n { #2 } }
\DenisBitouze_after_loop:
}
\group_end:
}%<<<
\ExplSyntaxOff
\begin{document}
\begin{figure}[t]% >>>
\centering
\multpages[pages=1-5,nup=3]{example-image-duck.pdf}
\caption
{%
A happy duck family%
\label{fig:ducks}%
}%
\end{figure}% <<<
\end{document}