为什么不考虑 (pdfpages) \includepdf 文件的高度?

为什么不考虑 (pdfpages) \includepdf 文件的高度?

以下 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 所做的更改:

  • hcorvcor键,允许对高度和宽度的计算进行细微调整(代替固定值.1pt,最初设置为 0pt)
  • 图像阵列后的垂直空间较小,导致字幕位置与单个\includegraphics
  • 有无一致的垂直空间\centering
  • 通过定义更多函数并重用函数(而不是代码块)来删除重复的代码并更加模块化

edit3 所做的更改:

  • hboxedtrue关键:是在表示在每行数字周围放置一个水平框,fixed表示将该行放入一个宽度固定的框中hsize, 和false表示不加框之间进行选择
  • vboxedtrue关键:也可以在、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}

在此处输入图片描述

在此处输入图片描述

相关内容