我需要使用第三方软件包的命令,该命令会将多页内容插入到我的文档中。有没有办法告诉 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。如果您使用任何其他操作系统,我可以不是会很有帮助。要使系统正常运行,您需要安装pdflatex
、pdftk
和(软件包的一部分)。请参阅您的特定 Linux 发行版以了解如何安装它们。我们需要使用这些,因为我没有找到一种方法来排除最后一页awk
而无需实际页面渲染。pdfinfo
xpdf
我理解你对外部预处理有些反感。但无论在提供的解决方案中进行何种处理,对最终用户来说都是非常透明的,并且可从 LaTeX 内部调用。
无论如何,解决方案就是这样运作的。
- 定义的宏
\insertfromthirdpartyapplicationwithoutlastpage
只需要一个参数。要插入的 LaTeX(输入,第三方生成)文件的名称,不带扩展名.tex
。下面提到的所有操作都包含在此宏中。 - 当使用 latex(或 pdflatex)编译主文件时,它会使用编译输入文件三次
pdflatex
来获得一个全参考解析.pdf
文件。如果涉及任何 BibTeX 或任何其他 LaTeX 朋友,我们也需要插入这些命令。请不要忘记使用-shell-escape
主文件的选项。否则内部\write18
将不会被执行。请参阅这里了解详情。 - 然后宏生成一个 shell 脚本 (\jobname.bash) 来保存生成的除最后一页之外的所有页面
pdf
文件中除最后一页之外的所有内容。同样,我发现没有命令行实用程序可以轻松排除最后一页。因此,这个脚本实际上计数页数,然后排除最后一页。 - 该宏使上述 shell 脚本可执行。
- 该宏执行脚本。执行后,此脚本将生成一个
.pdf
名为的文件<input file>minuslastpage.pdf
。 - 该宏用于
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的解决方案。