仅发送最后一页(或最后两页/三页)

仅发送最后一页(或最后两页/三页)

我的问题与以下问题相关并延续: 仅编译页面范围或页面选择

我想只输出最后一页(或最后两/三页),而无需提前知道总页数。如上述问题所述,应该对整个文档进行编译,所有计数器、页脚上的页码均应完好无损。

是否可以这样说\keeppages{-1}(根据上述问题的公认答案 -https://tex.stackexchange.com/a/96258/26682) 最后一页应该这样吗?我尝试了一下pageslts这个包,但不知道有什么方法可以实现我想要的效果。

有任何想法吗?

PS:这个问题是不言而喻的...这里实际上不需要 MWE。

答案1

以下是对仅编译页面范围或页面选择允许你使用从最后一页开始计数的负数。例如,你可以使用

\discardpages{-2,-1}

删除最后两页,或者

\keeppages{-3,-1}

只保留倒数第三页和最后一页。改编依赖于lastpage在最后一页放置一个\label{LastPage},并在计算中使用页码(感谢refcount)。

\documentclass{article}

\usepackage{lipsum,atbegshi,etoolbox}
\usepackage{lastpage,refcount}

\makeatletter
\newcommand{\discardpages}[1]{% \discardpages{<csv list>}
  \xdef\discard@pages{#1}% Store pages to discard
  \AtBeginShipout{% At shipout, decide whether to discard page/not
    \renewcommand*{\do}[1]{% How to handle each page entry in csv list
      \ifnum##1<0
        \ifnum\value{page}=\numexpr\getpagerefnumber{LastPage}+##1+1\relax
          \AtBeginShipoutDiscard% Discard page/not
          \gdef\do####1{}% Do nothing further
        \fi
      \else% ##1 >= 0
        \ifnum\value{page}=##1\relax%
          \AtBeginShipoutDiscard% Discard page/not
          \gdef\do####1{}% Do nothing further
        \fi
      \fi
    }%
    \expandafter\docsvlist\expandafter{\discard@pages}% Process list of pages to discard
  }%
}

\newif\ifkeeppage
\newcommand{\keeppages}[1]{% \keeppages{<csv list>}
  \xdef\keep@pages{#1}% Store pages to keep
  \AtBeginShipout{% At shipout, decide whether to discard page/not
    \keeppagefalse%
    \renewcommand*{\do}[1]{% How to handle each page entry in csv list
      \ifnum##1<0
        \ifnum\value{page}=\numexpr\getpagerefnumber{LastPage}+##1+1\relax
          \keeppagetrue% Page should be kept
          \gdef\do####1{}% Do nothing further
        \fi
      \else% ##1 >= 0
        \ifnum\value{page}=##1\relax%
          \keeppagetrue% Page should be kept
          \gdef\do####1{}% Do nothing further
        \fi
      \fi
    }%
    \expandafter\docsvlist\expandafter{\keep@pages}% Process list of pages to keep
    \ifkeeppage\else\AtBeginShipoutDiscard\fi% Discard page/not
  }%
}
\makeatother

%\discardpages{-2,-1}
\keeppages{-3,-1}% Keep these pages.

\begin{document}

\sloppy\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]

\end{document}

引用LastPage必须稳定才能有效。因此,对于此\label位置的每次更改(或第一次更改),您都必须至少编译两次。

没有进行进一步的测试来查看atveryend可能需要。

答案2

这种方法的问题在于,TeX 的模型是按顺序从“盒子”和“胶水”中构建出来的。为了弄清楚第 17 页的内容,TeX 系统需要布局前 16 页。您链接的问题定义了一些删除页面的宏pdf 生成,但那些页面仍然会生成。

最简单的手动方法是在查看器中打开生成的 PDF,然后使用“打印为 PDF”选项,指定页面范围。如果您想以自动化方式执行此操作,则这将更加依赖于平台。

相关内容