是否可以检测文档中的可用空间来放置图像?

是否可以检测文档中的可用空间来放置图像?

我们生成包含动态内容的 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 页)。因此,如果您想在脚本中更改它,则必须更正高度。虽然高度小于剩余高度的图片不会造成问题,但太高的图片会造成混乱。

在此处输入图片描述

相关内容