关于向现有 pdf 添加复杂标题的输入?

关于向现有 pdf 添加复杂标题的输入?

我每个月都会使用出色的提醒程序自动生成一个 postscript(横向)日历,然后通过 ps2pdf 运行 ps 文件以生成 pdf 文件。我需要自动在日历页面的标题中包含一些附加信息。我无法找到使用提醒来做到这一点的方法,但我确实发现了一种使用 pdftk 添加增强标题的解决方案:我创建了一个仅包含标题作为内容的 pdf 文件,然后使用 pdftk 将日历覆盖在其上。但现在,由于 pdftk 的开发缓慢,我不得不将其从我的系统中删除,因为它的存在阻碍了重要的更新。所以我正在寻找将标题文本覆盖到日历上的替代方法。

在寻找替代方案的过程中,我遇到了https://askubuntu.com/questions/712691/batch-add-header-footer-to-pdf-filesm它为像我这样的初学者提供了一个不错的基础,可以尝试使用 LaTeX (pdflatex) 来完成我的任务。以下是基于该帖子的 MWE,到目前为止,它给出了可接受的结果:

\documentclass{article}
\RequirePackage[letterpaper,landscape,top=3cm,left=1cm,right=1cm,bottom=1.5cm,headheight=57pt]{geometry}
\pagenumbering{gobble}

\usepackage{pdfpages}
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}

\fancyfoot[CO]{***For emergencies don't call us, we'll call you!***}

\fancyhead[L]{\small After hours contacts: \\ Carrier 1: 111-2222 \\ Carrier 2 111-3333 \\ Carrier 3 111-4444 \\}
\fancyhead[C]{\LARGE My Fancy Calendar Header for \\}
\fancyhead[R]{\small Text here \\ More text here \\ Yet more text here \\ And so forth \\ Final line added to fix misalignment issue}

\includepdf[pagecommand={\thispagestyle{fancy}},pages=1 ]{Feb-2018.pdf}

\end{document}

我对包含该内容的 .tex 文件运行 pdflatex 并得到一个叠加的日历 pdf。

显然,我试图抑制页码和水平线。使用这种方法得到的结果确实正确地覆盖了 pdf 日历,看起来也不错,尽管出于某种原因,标题右侧的文本看起来比左侧的文本低一行。因此,虽然它给出了可接受的结果,但从外观上看,它确实存在一些缺点。

我只是想问一下,这里的 LaTeX 行家们是否觉得我正在以一种合理的方式完成我的任务?我知道使用 LaTeX 可能还有其他方法可以实现目标:例如,我发现将图像文件叠加为标题也可能有效。我应该提到,我制作的日历已经有一个居中的标题,其中包括月份和年份的名称,所以我的增强标题必须围绕它(上方、左侧和右侧)。如果能提供进一步的指示、提示和/或改进,我们将不胜感激。

后来的编辑:我认为一个矮矮的表格(大约 0.75 英寸高)只有一行和三列,没有边框,要么合并到标题中,要么只是放置在页面的最顶部,可能会产生最佳和最可预测的结果。中间的列需要比外面的两列宽得多。使用标准标题并尝试容纳多行,就像我所做的那样,会导致各行在页面上相互推挤。由于标题元素局限于表格列,内容应该更易于控制。

后来编辑:我决定坚持使用上面给出的 MWE 作为我的问题的解决方案。cfr 关于基线的解释帮助我对我看到的轻微错位进行了分类,并且由于标题左侧和右侧的项目数量相同,因此最终输出是完全可以接受的。

答案1

TeX 与基线对齐。左标题包含一个额外的空行。因此,它比右标题的内容少一行。要查看此内容,请尝试xxx在每个标题规范的末尾添加。

\fancyhead[L]{\small After hours contacts: \\ Carrier 1: 111-2222 \\ Carrier 2 111-3333 \\ Carrier 3 111-4444\\ xxx}

\fancyhead[R]{\small Text here \\ More text here \\ Yet more text here \\ And so forth xxx}

对齐标题

注意与基线的对齐。这里的要点是 TeX 始终从基线开始。因此它不会从标题内容框的顶部开始。它将标题内容作为一个框并将其放在当前基线上。此点位于标题的基线处,该基线根据geometryheadheightpaperheight、上边距headsep等计算出的值放置。

但是,在排版每个标题部分的框内内容时,TeX 从内容的第一行基线开始。因此,这是您设置After hours contacts和的基线Text here。它会一直延伸到最后。因此,框的高度取决于行数和每行的高度。然后,两个框在它们的基线(即底部)对齐。因此,较矮的框比较高的框上方有更多空间,就像树木、塔楼和杂食动物的情况一样:如果天花板、天空或屋顶与地面的距离相同,则较矮的框顶部上方有更多空间。

因此,您可以通过使内容始终占用相同的垂直空间来对齐它们。但是,这很容易出错。如果您希望它们在顶部对齐(如您似乎所想的那样),最好明确强制这样做。另外,不要在行首留空格,否则可能会或可能不会变得参差不齐。如果您尝试在源中使用空格进行对齐:请不要。这行不通。空格是粘性的。它们会收缩和伸展。因此,即使字体不变,单词之间的间距也会发生变化。此外,它们经常被各种东西吃掉。

不要gobble编页码。这会引起问题。不要排版页码。

例如,

\documentclass{article}
\usepackage[letterpaper,showframe,landscape,top=3cm,left=1cm,right=1cm,bottom=1.5cm,headheight=57pt]{geometry}
\usepackage{pdfpages}
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\familydefault}{\sfdefault}
\fancyhf{}
\newsavebox\lrhdrbox

\begin{document}

\sbox\lrhdrbox{%
  \begin{minipage}{\linewidth}
    \small\normalfont
    \begin{minipage}[t]{.25\linewidth}
      \raggedright
      After hours contacts:\\Carrier 1: 111-2222\\Carrier 2 111-3333\\Carrier 3 111-4444\\Aardvarks 'R Ace
    \end{minipage}%
    \begin{minipage}[t]{.5\linewidth}
      \centering
      \LARGE My Fancy Calendar Header for 
    \end{minipage}%
    \begin{minipage}[t]{.25\linewidth}
      \raggedleft
      Text here\\More text here\\Yet more text here\\And so forth
    \end{minipage}%
  \end{minipage}%
}
\fancyfoot[CO]{***For emergencies don't call us, we'll call you!***}%
\fancyhead[C]{\usebox\lrhdrbox}%

\includepdf[pagecommand={\thispagestyle{fancy}},pages=1 ]{enfys}

\end{document}

产生以下内容(showframe显示文本区域和边距布局geometry- 显然在实际文档中删除此选项):

顶部对齐标题

请注意,左侧标题包含的内容行数比右侧标题多,但它们在顶部对齐,因此“开始”于纸张顶部下方的同一垂直点。

相关内容