![如何在页眉中显示包含的 pdf 文件的页码,如“pp: xx”?](https://linux22.com/image/306859/%E5%A6%82%E4%BD%95%E5%9C%A8%E9%A1%B5%E7%9C%89%E4%B8%AD%E6%98%BE%E7%A4%BA%E5%8C%85%E5%90%AB%E7%9A%84%20pdf%20%E6%96%87%E4%BB%B6%E7%9A%84%E9%A1%B5%E7%A0%81%EF%BC%8C%E5%A6%82%E2%80%9Cpp%3A%20xx%E2%80%9D%EF%BC%9F.png)
我想在一个根文件中包含大约 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