放下当前页面

放下当前页面

我需要使用第三方软件包的命令,该命令会将多页内容插入到我的文档中。有没有办法告诉 LaTeX 忽略这些页面中的最后一页?例如,该命令插入了 3 页,但我只想要前两页。

同样,我可以告诉 LaTeX 简单地删除当前页面,即返回到最后一个硬分页符(\newpage)并忘记自那时以来添加的所有内容吗?

显然,我可以使用外部后期处理轻松地从生成的 PDF 中删除该页面,但如果可能的话,我宁愿直接在文档中执行此操作。

请注意,我无法修改第三方包,并且不使用该包中的命令不是一个可接受的解决方案。

答案1

如果你知道页面数量将包含在第三方包/命令中,然后您可以使用以下命令发出多个嵌套命令atbegshi丢弃特定页面。以下 MWE 提供将从当前页面中\removepage{<num>}删除页面的功能:<num>

在此处输入图片描述

\documentclass{article}
\usepackage{atbegshi,multido,graphicx}% http://ctan.org/pkg/{atbegshi,multido,graphicx}
\makeatletter
\newcommand{\removepage}[1]{%
  \def\@drop@this@page{\AtBeginShipoutDiscard}%
  \multido{\iA=1+1}{#1}{%
    \expandafter\gdef\expandafter\@drop@this@page\expandafter%
      {\expandafter\AtBeginShipoutNext\expandafter{\@drop@this@page}}%
    }%
  \@drop@this@page%
}
\newcommand{\magiccommand}{% Inserts 9 pages
  \multido{\iA=1+1}{9}{\clearpage\centering\scalebox{40}{\iA}}}

\makeatother
\begin{document}
\removepage{3}%
\magiccommand% 3rd-party command for including a bunch of pages
\end{document}

请注意,使用此方法将完全丢弃页面(包括页眉/页脚),其中可能包含递增的页码。如果需要,应该对此进行更正,也许作为 的一部分\removepage

如果\magiccommand仅插入与当前文档一起格式化的文本(而不是包括独立的完整页面),那么您可以\AtBeginShipoutNext{\AtBeginShipoutDiscard}在命令后发出该命令,该命令将删除最后一页。

答案2

由于没有太多关于您的第三方应用程序的信息(我知道可能涉及一些官方机密,没问题),我假设您对生成的(LaTeX)文件的名称有一定的控制权。(如果您无法控制生成的文件的名称,请告诉我。我们可以在运行时将它们放入一些预先确定的 LaTeX 文件中。)

以下解决方案基于 Linux。如果您使用任何其他操作系统,我可以不是会很有帮助。要使系统正常运行,您需要安装pdflatexpdftk和(软件包的一部分)。请参阅您的特定 Linux 发行版以了解如何安装它们。我们需要使用这些,因为我没有找到一种方法来排除最后一页awk而无需实际页面渲染。pdfinfoxpdf

我理解你对外部预处理有些反感。但无论在提供的解决方案中进行何种处理,对最终用户来说都是非常透明的,并且可从 LaTeX 内部调用。


无论如何,解决方案就是这样运作的。

  1. 定义的宏\insertfromthirdpartyapplicationwithoutlastpage只需要一个参数。要插入的 LaTeX(输入,第三方生成)文件的名称,不带扩展名.tex。下面提到的所有操作都包含在此宏中。
  2. 当使用 latex(或 pdflatex)编译主文件时,它会使用编译输入文件三次pdflatex来获得一个全参考解析.pdf文件。如果涉及任何 BibTeX 或任何其他 LaTeX 朋友,我们也需要插入这些命令。请不要忘记使用-shell-escape主文件的选项。否则内部\write18将不会被执行。请参阅这里了解详情。
  3. 然后宏生成一个 shell 脚本 (\jobname.bash) 来保存生成的除最后一页之外的所有页面pdf文件中除最后一页之外的所有内容。同样,我发现没有命令行实用程序可以轻松排除最后一页。因此,这个脚本实际上计数页数,然后排除最后一页。
  4. 该宏使上述 shell 脚本可执行。
  5. 该宏执行脚本。执行后,此脚本将生成一个.pdf名为的文件<input file>minuslastpage.pdf
  6. 该宏用于pdfpages插入上述文件的所有页面 <input file>minuslastpage.pdf

我提供了以下三个.tex文件供您立即测试。第一个文件可以以任何您喜欢的名称保存。后两个文件应以所示名称保存。


主文件

使用(pdf)latex -shell-escape命令编译此文件。您应该得到五页输出(1 页来自主文件,2 页减 1 来自插入文件,1 页来自主文件,2 页减 1 来自插入文件,1 页来自主文件)。

\documentclass{article}

\usepackage{pdfpages}

\def\insertfromthirdpartyapplicationwithoutlastpage#1{%
  % Compile your generated third party LaTeX file three times to get the pdf output
  \immediate\write18{pdflatex #1.tex}
  \immediate\write18{pdflatex #1.tex}
  \immediate\write18{pdflatex #1.tex}
  % Generate a shell script (\jobname.bash) to save all but last page from generated pdf file
  \newwrite\shellscript
  \immediate\openout\shellscript=\jobname.bash
  \immediate\write\shellscript{pagecount=`pdfinfo #1.pdf | grep 'Pages:' | awk '{print $2}'`}
  \immediate\write\shellscript{pagecount=$(( $pagecount - 1 ))}
  \immediate\write\shellscript{pdftk A=#1.pdf cat A1-$pagecount output #1minuslastpage.pdf}
  \immediate\closeout\shellscript
  % Make the generated shell script executable
  \immediate\write18{chmod +x ./\jobname.bash}
  % Execute the shell script to remove the last page from pdf file
  \immediate\write18{. ./\jobname.bash}
  % Include the pdf file with last page removed
  \includepdf[pages=-]{#1minuslastpage.pdf}
}

\begin{document}

Some opening text.

\insertfromthirdpartyapplicationwithoutlastpage{insertfileone}

Middle text

\insertfromthirdpartyapplicationwithoutlastpage{insertfiletwo}

Closing text.

\end{document}

输入 LaTeX 文件进行测试(代替第三方生成的文件)

insertfileone.tex

\documentclass{article}

\usepackage{lipsum}

\begin{document}

\lipsum[1-10]

\end{document}

insertfiletwo.tex

\documentclass{article}

\usepackage{lipsum}

\begin{document}

\lipsum[11-20]

\end{document}

和上面的解决方案截然不同的是,我们可以用一种完全不同的方式思考一个基于Makefile的解决方案。

相关内容