我们生成包含动态内容的 PDF。此外,我们想在文档的空白处放置一些附加图片或广告。
例如,我们有一个页面,第一页有标题和描述。页面的 40% 是空白的,因此我们想在那里放置一张图片来填充页面。
有没有什么办法可以实现这种行为?
答案1
此部分解决方案使用notespages
包及其命令\notesfill
在页面的剩余空间中插入内容。这里graphic
定义了一个新的注释样式,用于插入图片。新选项graphic
用于将插入图片的命令传递给注释样式。第 4 节显示了此示例。默认为打印剩余高度。
无论\notesfill
在源代码中出现什么,它都会填充当前页面的剩余部分。因此,将它放在任何出现的\newpage
、\clearpage
或调用它们的命令(例如\chapter
或\include
)之前是有意义的。它必须位于自己的段落中。
如果所用高度小于剩余高度,则插入的材料\notesfill
将被移至页面底部。如果不希望这样,则必须添加选项filltopfill=false
。
该选项fillminspace
设置插入内容的最小高度。第 3 页上可以看到一个示例,其中剩余空间小于给定的。虽然源代码中0.25\textheight
有,但这里没有插入任何内容。\notesfill
主文件(fill-empty-space-with-pictures.tex):
\documentclass[a4paper]{article}
\usepackage{notespages}
\usepackage{currfile}
\usepackage{graphicx}
\usepackage{lipsum}
\makeatletter
% write information about free space to \jobname.gsh (gsh: graphic space height)
\AtEndDocument{\if@filesw\newwrite\tf@gsh
\immediate\openout\tf@gsh\jobname.gsh\fi
}
\newcommand{\np@graphic@writeinfo}{%
\protected@write\@auxout{}%
{\string\@writefile{gsh}{\the\inputlineno; \the\c@page; \the\graphicheight; \currfilename}}%
}
% necessary because of rounding error, presumably by the graphicx package
\newdimen\graphicheight
\newcommand{\np@calc@graphicheight}{%
\graphicheight\remainingtextheight
\advance\graphicheight-0.1\p@
}
% default for option graphic
\newcommand{\np@graphic@default}{%
\centering remaining height: \the\graphicheight
}
% the new graphic option
\newcommand{\np@graphic}{}
\key@ifundefined{np}{graphic}{}{\np@err@defined{graphic}}
\define@key{np}{graphic}[\np@graphic@default]{\def\np@graphic{%
\np@calc@graphicheight\np@graphic@writeinfo #1\par}}
% initialize it
\setkeys{np}{graphic}
% new notes style
\definenotesstyle{graphic}{\np@graphic}
\makeatother
% global settings
\setnotespages{
filltopskip=2ex,
fillminspace=0.25\textheight,
notesstyle=graphic
}
% for advertisments
\definenotesoption{advert}{%
titlestyle=text,
titletext={\centering Advertisement},
titleskip=1ex
}
% for other graphics
\definenotesoption{normal}{%
titlestyle=none
}
\begin{document}
\section{Section One}
\lipsum[1-3]
\notesfill[advert]
\newpage
\section{Section Two}
\lipsum[1-2]
\notesfill[advert]
\newpage
\section{Section Three}
\lipsum[1-4]
\notesfill[advert]
\newpage
\input{fill-empty-space-with-pictures_a}
\end{document}
包含的文件(fill-empty-space-with-pictures_a.tex):
\section{Section Four}
\lipsum[1]
\notesfill[advert,graphic={\centering\includegraphics[height=\graphicheight,width=\textwidth,keepaspectratio]{example-image.pdf}}]
\newpage
\section{Section Five}
\lipsum[2]
\notesfill[normal]
\newpage
\section{Section Six}
\lipsum[4]
\notesfill[advert]
新的注释样式还将有关可用空间的信息写入文件\jobname.gsh
。它采用 csv 格式(;
作为列分隔符),包含四列:\notesfill
源中命令的行号、页码、图片的剩余高度和源的文件名(要获取包含文件的文件名,currfile
将使用包)。请注意,第 3 页没有条目,因为没有足够的空间用于图片。以下是一个例子:
66; 1; 204.08061pt; fill-empty-space-with-pictures.tex
72; 2; 324.08061pt; fill-empty-space-with-pictures.tex
4; 4; 408.08061pt; fill-empty-space-with-pictures_a.tex
10; 5; 482.44171pt; fill-empty-space-with-pictures_a.tex
16; 6; 468.08061pt; fill-empty-space-with-pictures_a.tex
还有一些工作留给您:编写一个脚本,读取文件.gsh
,选择具有合适高度的图片,使用适当的命令添加选项以在源中graphic={...}
插入图片,最后重新编译它。\notesfill
请注意,根据图片上方是否有标题(示例中为“广告”),剩余高度会有所不同(见第 5 页和第 6 页)。因此,如果您想在脚本中更改它,则必须更正高度。虽然高度小于剩余高度的图片不会造成问题,但太高的图片会造成混乱。