仅编译页面范围或页面选择

仅编译页面范围或页面选择

如何轻松地只编译页面范围或页面选择?也就是说,我想要一份文档

  • 看起来和完整文档一模一样,
  • 仅包含按页码手动选择的页面子集(这可以是一个连续的范围或更复杂的选择,如“12-15,23,45-49”),
  • 有正确的页码,并且
  • 具有正确的链接,但缺失页面的链接可能存在功能障碍或缺失。

答案1

atbegshi提供了使用 丢弃准备发送的页面的功能\AtBeginShipoutDiscard。与etoolbox的列表处理功能,您可以轻松地有条件地丢弃/保留页面:

\documentclass{article}
\usepackage{lipsum,atbegshi,etoolbox}% http://ctan.org/pkg/{lipsum,atbegshi,etoolbox}
\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\value{page}=##1\relax%
        \AtBeginShipoutDiscard% Discard page/not
        \gdef\do####1{}% Do nothing further
      \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\value{page}=##1\relax%
        \keeppagetrue% Page should be kept
        \gdef\do####1{}% Do nothing further
      \fi%
    }%
    \expandafter\docsvlist\expandafter{\keep@pages}% Process list of pages to keep
    \ifkeeppage\else\AtBeginShipoutDiscard\fi% Discard page/not
  }%
}
\makeatother
\discardpages{1,3,5,7,9,29,35,40}% Discard these pages.
%\keeppages{2,4,6}% Keep these pages.
\begin{document}
\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]
\end{document} 

删除 8 页 1、3、5、7、9、29、35、40(由 提供\discardpages{1,3,5,7,9,29,35,40})后,上述 47 页文档缩减为 39 页。要丢弃零页,可以使用\discardpages{}(或不调用\discardpages)。使用\keeppages{2,4,6}会留下仅包含 2、4 和 6 页的 3 页文档。将其扩展以包含更复杂的页面范围应该并不困难。

以上内容不是已测试来自的超链接hyperref

答案2

与 David Carlisle 的回答一致,但使用纯乳胶工具,我很惊讶没有人提到pdfpages包。

您可以编译完整文档,然后使用另一个使用 的 latex“驱动”文档提取所需页面pdfpages。例如:

\documentclass{article} % Not really important
\usepackage{pdfpages}
\begin{document}
\includepdf[pages={12-15,23,45-49}]{main.pdf}
\end{document}

答案3

还应该提到以下软件包:

  • 选择项:[适用于纯 TeX 和 LaTeX 2.09]

选择要输出的页面

定义一个命令\out­pu­tonly,其参数是要输出的页面列表。如果命令存在(在之前 \be­gin{doc­u­ment}),则只输出这些页面。

选择要从文档输出的页面

需要一个页码文件,它指定要打印的页数(按生成的顺序)。

答案4

这是 Werner 的解决方案,无需花费每页循环的成本。

\documentclass{article}
\usepackage{lipsum,atbegshi}
\makeatletter
\newcommand{\discardpages}[1]{%
  \xdef\discard@pages{\zap@space#1 \@empty}%
  \AtBeginShipout{%
    \@expandtwoargs\in@{,\the\c@page,}{,\discard@pages,}%
    \ifin@\AtBeginShipoutDiscard\fi
  }%
}
\newcommand{\keeppages}[1]{%
  \xdef\keep@pages{\zap@space#1 \@empty}%
  \AtBeginShipout{%
    \@expandtwoargs\in@{,\the\c@page,}{,\keep@pages,}%
    \ifin@\else\AtBeginShipoutDiscard\fi
  }%
}
\makeatother

% Examples:
\discardpages{1,3,5,7,9,29,35,40}
%\keeppages{2,4,6}
\begin{document}
\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]\lipsum[1-50]
\end{document} 

相关内容