如何在页眉中显示包含的 pdf 文件的页码,如“pp: xx”?

如何在页眉中显示包含的 pdf 文件的页码,如“pp: xx”?

我想在一个根文件中包含大约 500-600 篇会议论文。我的根文件如下:

\documentclass[a4paper,11pt]{article}
\usepackage{lipsum}
\usepackage{pdfpages}
\usepackage{fancyhdr}
\fancypagestyle{mystyle}{%
\fancyhf{} 
\fancyhead[R]{LOGO}
\fancyhead[C]{The 7th International Conference on...}
\fancyhead[L]{pp: ?-?}
\fancyfoot[C]{\thepage}
}
\begin{document}
\pagestyle{mystyle}
\includepdf[pages=-,pagecommand={\pagestyle{mystyle}}]{pdf-1.pdf}
\includepdf[pages=-,pagecommand={\pagestyle{mystyle}}]{pdf-2.pdf}
\end{document} 

pdf-1.pdf产生和的代码pdf-2.pdf是:

\documentclass[a4paper,11pt]{article}
\usepackage{lipsum}
\title{The first Paper}
\author{John Doe}
\begin{document}
\pagestyle{empty}
\maketitle
\thispagestyle{empty}
\lipsum[1-17]
\end{document} 

\documentclass[a4paper,11pt]{article}
\usepackage{lipsum}
\title{The Second Paper}
\author{Joe Smith}
\begin{document}
\pagestyle{empty}
\maketitle
\thispagestyle{empty}
\lipsum[6-18]
\end{document}

现在我想将包含的 pdf 文件的页码显示为“页面范围”,就像pp: x-x在页眉中一样。例如,对于第一个包含的 pdf 文件(长度为 4 页)的所有页面,我希望pp: 1-4在其 4 页的所有页眉上都有,如下面的屏幕截图所示;对于第二篇论文,我希望有pp: 5-7

在此处输入图片描述

我怎样才能做到这一点?
还请注意,我正在使用 xelatex,并且一些包含的 pdf 文件不在当前目录中(我在命令中设置了它们的路径\includepdf)。

答案1

修订的解决方案(2 次编译,需要少量人工干预)

如果我花更多时间,我可能可以消除手动干预。但 OP 希望在不知道所包含子文档的长度(提前)的情况下完成任务。为此,我使用了该pdfpages包的“调查”功能。

我有代码,其中有两行必须取消注释/修改才能进行第二遍。以下是需要特别注意的几行:

%%%%%
% AFTER 1ST RUN, ADD THIS LAST ONE MANUALLY
%\newlabel{pdfpages@page?}{{}{?}}% CREATE THIS BASED ON aux FILE
%\revisegetthepages% UNCOMMENT THIS FOR 2ND PASS
%%%%%

对于第一遍,这是完整的 MWE:

\documentclass[a4paper,11pt]{article}
\usepackage{lipsum}
\usepackage[enable-survey]{pdfpages}
\renewcommand\newlabel[2]{\getfirstpage#2%
  \expandafter\xdef\csname #1\endcsname{\thefirstpage}}
\newcommand\getfirstpage[2]{\gdef\thefirstpage{#2}}
\newcommand\getthepages{\edef\startpage{?}\edef\endpage{?}}
\def\revisegetthepages{\def\getthepages{%
  \edef\startpage{\csname pdfpages@page\arabic{localdoc}\endcsname}%
  \stepcounter{localdoc}%
  \edef\tmp{\csname pdfpages@page\arabic{localdoc}\endcsname}%
  \setcounter{tmpcount}{\tmp}%
  \addtocounter{tmpcount}{-1}%
  \def\endpage{\thetmpcount}%
}}
%%%%%
% AFTER 1ST RUN, ADD THIS LAST ONE MANUALLY
%\newlabel{pdfpages@page?}{{}{?}}% CREATE THIS BASED ON aux FILE
%\revisegetthepages% UNCOMMENT THIS FOR 2ND PASS
%%%%%
\usepackage{fancyhdr}
\fancypagestyle{mystyle}{%
\fancyhf{} 
\fancyhead[R]{LOGO}
\fancyhead[C]{The 7th International Conference on...}
\fancyhead[L]{pp: ?-?}
\fancyfoot[C]{\thepage}
}
\newcounter{tmpcount}
\newcounter{localdoc}
\newcommand\Includepdf[1]{%
  \getthepages%
  \global\fancyhead[L]{pp: \startpage--\endpage}
\AddToSurvey
  \includepdf[pages=-,pagecommand={\pagestyle{mystyle}}]{#1}%
}
\begin{document}
\pagestyle{mystyle}
\Includepdf{pdf-1.pdf}
\Includepdf{pdf-2.pdf}
\end{document}

它创建一个带有占位符的文档,例如:

在此处输入图片描述

更重要的是,该\AddToSurvey功能将以下几行放置在aux文件中:

\relax
\newlabel{pdfpages@page0}{{}{1}}
\newlabel{pdfpages@page1}{{}{5}}

编辑序言中的类似行,以反映下一个包含的文档(如果有的话)的内容。此外,取消注释\revisegetthepages序言中的行。这些是第一遍的关键添加/修改

%%%%%
% AFTER 1ST RUN, ADD THIS LAST ONE MANUALLY
\newlabel{pdfpages@page2}{{}{8}}% CREATE THIS BASED ON aux FILE
\revisegetthepages% UNCOMMENT THIS FOR 2ND PASS
%%%%%

这是第二遍版本:

\documentclass[a4paper,11pt]{article}
\usepackage{lipsum}
\usepackage[enable-survey]{pdfpages}
\renewcommand\newlabel[2]{\getfirstpage#2%
  \expandafter\xdef\csname #1\endcsname{\thefirstpage}}
\newcommand\getfirstpage[2]{\gdef\thefirstpage{#2}}
\newcommand\getthepages{\edef\startpage{?}\edef\endpage{?}}
\def\revisegetthepages{\def\getthepages{%
  \edef\startpage{\csname pdfpages@page\arabic{localdoc}\endcsname}%
  \stepcounter{localdoc}%
  \edef\tmp{\csname pdfpages@page\arabic{localdoc}\endcsname}%
  \setcounter{tmpcount}{\tmp}%
  \addtocounter{tmpcount}{-1}%
  \def\endpage{\thetmpcount}%
}}
%%%%%
% AFTER 1ST RUN, ADD THIS LAST ONE MANUALLY
\newlabel{pdfpages@page2}{{}{8}}% CREATE THIS BASED ON aux FILE
\revisegetthepages% UNCOMMENT THIS FOR 2ND PASS
%%%%%
\usepackage{fancyhdr}
\fancypagestyle{mystyle}{%
\fancyhf{} 
\fancyhead[R]{LOGO}
\fancyhead[C]{The 7th International Conference on...}
\fancyhead[L]{pp: ?-?}
\fancyfoot[C]{\thepage}
}
\newcounter{tmpcount}
\newcounter{localdoc}
\newcommand\Includepdf[1]{%
  \getthepages%
  \global\fancyhead[L]{pp: \startpage--\endpage}
\AddToSurvey
  \includepdf[pages=-,pagecommand={\pagestyle{mystyle}}]{#1}%
}
\begin{document}
\pagestyle{mystyle}
\Includepdf{pdf-1.pdf}
\Includepdf{pdf-2.pdf}
\end{document}

它生成所需的文档,并在标题中指定子文档页面分隔符。

在此处输入图片描述

在此处输入图片描述

原始解决方案(手动提供子文档长度)

在这里我创建了\Includepdf{pages}{filename},它使用参数#1来更新计数器,并\fancyhead[L]{}动态地进行更改。

\documentclass[a4paper,11pt]{article}
\usepackage{lipsum}
\usepackage{pdfpages}
\usepackage{fancyhdr}
\fancypagestyle{mystyle}{%
\fancyhf{} 
\fancyhead[R]{LOGO}
\fancyhead[C]{The 7th International Conference on...}
\fancyhead[L]{pp: ?-?}
\fancyfoot[C]{\thepage}
}
\newcounter{localpage}
\newcommand\Includepdf[2]{%
  \global\fancyhead[L]{pp: \the\numexpr\thelocalpage+1\relax%
    --\the\numexpr\thelocalpage+#1\relax}
  \includepdf[pages=-,pagecommand={\pagestyle{mystyle}}]{#2}%
  \addtocounter{localpage}{#1}
}
\begin{document}
\pagestyle{mystyle}
\Includepdf{4}{pdf-1.pdf}
\Includepdf{3}{pdf-2.pdf}
\end{document} 

答案2

这是解决这个问题的方法

\documentclass[a4paper,11pt]{article}

\usepackage{pdfpages}
\usepackage{hyperref}
\usepackage{fancyhdr}
\fancypagestyle{mystyle}{%
\fancyhf{} 
\fancyhead[R]{LOGO}
\fancyhead[C]{The 7th International Conference on...}
\fancyhead[L]{pp: \themtp-\mtt}
\fancyfoot[C]{\thepage}
}
\makeatletter
\newcounter{mtp}
\let\mtpdf\includepdf
\def\includepdf[#1]#2{%
\def\mtt{\pageref{#2}}%
\mtpdf[#1]{#2}%
\immediate\write\@auxout{\string\newlabel{#2}{{}{\themtp}{}{}}}%
\setcounter{mtp}{0}}
\makeatother
\begin{document}
\pagestyle{mystyle}
\includepdf[pages=-,pagecommand={\refstepcounter{mtp}\pagestyle{mystyle}}]{pdf-1.pdf}
\includepdf[pages=-,pagecommand={\refstepcounter{mtp}\pagestyle{mystyle}}]{pdf-2.pdf}
\end{document} 

我们真的不需要\refstepcounter我们可以用\stepcounter

相关内容