如何正确标记包含的 PDF?

如何正确标记包含的 PDF?

我有这个:

\label{appendix:b}
\includepdf[scale=0.8,pages=1,pagecommand=\chapter{interview}]{interview/interview}
\includepdf[scale=0.8,pages=2-,pagecommand={}]{interview/interview}
\label{appendix:bslut}

我用 cleveref 来调用它:

\cpagerefrange{appendix:b}{appendix:bslut}

问题是我得到了错误的页码,最后一页被加了一页。应该是“第 1-5 页”,但实际上是“第 1-6 页”。我疯狂地在 Google 上搜索,但不知道该怎么办。希望这里的一些超级明星能帮上忙!我按照建议在 hyperref 之后使用了 cleveref...

编辑:根据要求,我尝试制作 MWE,但由于某种原因,它给了我:

LaTeX Warning: Reference `appendix:bslut' on page 1 undefined on input line 7.

不过,它在这里。“多页”应该是跨越多页的 PDF。

\documentclass{memoir}
\usepackage{pdfpages}
\usepackage{hyperref}
\usepackage{cleveref}
\begin{document}
\chapter{Foo}
Foo\cpagerefrange{appendix:b}{appendix:bslut}.

\chapter{Bar}
\label{appendix:b}
\includepdf[scale=0.8,pages=1,pagecommand=\chapter{Multipage}]{multipage}
\includepdf[scale=0.8,pages=2-,pagecommand={}]{multipage}
\label{appendix:bslut}

\end{document}

答案1

以下代码获取所包含 PDF 第一页的章节标题并启用正确的页面引用。mypages是一个 16 页的 PDF,仅用于演示目的。

\documentclass{memoir}
\usepackage{pdfpages}
\usepackage{hyperref}
\usepackage{cleveref}

\makeatletter
  \newcommand\incpdfchapter{%
    \ifartopt\par\@nameuse{chapterblock}\else
      \thispagestyle{chapter}
      \global\@topnum\z@
    \fi
    \m@mindentafterchapter
    \@ifstar{\@m@mschapter}{\@m@mchapter}}
\makeatother

\begin{document}
\chapter{Foo}
Foo\cpagerefrange{appendix:b}{appendix:bslut}.

\chapter{Bar}
\clearforchapter
\includepdf[scale=0.8,pages=1,pagecommand=\incpdfchapter{Multipage}\label{appendix:b}]{mypages}
\includepdf[scale=0.8,pages=2-15,pagecommand={}]{mypages}
\includepdf[scale=0.8,pages=16,pagecommand={}\label{appendix:bslut}]{mypages}

\end{document}

如果您希望采用更加自动化的解决方案,但牺牲指定标签的灵活性,您可以尝试以下方法:

\documentclass{memoir}
\usepackage{pdfpages}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{xparse}

\makeatletter
  \newcommand\incpdfchapter{%
    \ifartopt\par\@nameuse{chapterblock}\else
      \thispagestyle{chapter}
      \global\@topnum\z@
    \fi
    \m@mindentafterchapter
    \@ifstar{\@m@mschapter}{\@m@mchapter}}
  \newcounter{incpdfpages}
  \NewDocumentCommand\myincpdf{ d<> O {} m m }{%
    \clearforchapter
    \IfNoValueTF{#1}{%
      \def\incpdflabel{#3}}{%
      \def\incpdflabel{#1}}
    \includepdf[#2, pages=1, pagecommand=\incpdfchapter{#3}\label{\incpdflabel}]{#4}%
    \setcounter{incpdfpages}{1}%
    \includepdf[#2, pages=2-, pagecommand=\refstepcounter{incpdfpages}\label{\incpdflabel:\theincpdfpages}]{#4}%
    }
  \NewDocumentCommand\mysingpdf{ d<> O {} m m }{%
    \clearforchapter
    \IfNoValueTF{#1}{%
      \def\incpdflabel{#3}}{%
      \def\incpdflabel{#1}}
    \includepdf[#2, pages=1, pagecommand=\incpdfchapter{#3}\label{\incpdflabel}]{#4}%
    }
\makeatother

\begin{document}
\chapter{Foo}
Foo\cpagerefrange{appendix:b}{appendix:b:16}. Here is a reference to \cpageref{appendix:c}.

\chapter{Bar}
\myincpdf<appendix:b>[scale=0.8]{My Pages}{mypages}
\mysingpdf<appendix:c>[scale=0.8]{My Other Page}{mygraphics}

\end{document}

再次,mypages.pdf假设为 16 页 PDF。该命令\myincpdf<>[]{}{}需要 2 个可选参数和 2 个强制参数。

  1. 第一个可选参数使用 指定<>,应该是您要用于所包含 PDF 第一页的标签。后续页面的标签是通过附加原始 PDF 中的页码来:n从此标签构建的。例如,如果 PDF 有 16 页,则最后一页将获得您为第一页指定的标签。如果您未指定标签,它将被设置为章节标题的值。(如果章节标题包含标签中不起作用的字符,请注意不要未设置标签。)nbaselabel:16baselabel
  2. 第二个可选参数使用 指定[]。包括您想要传递到\includepdf这里的任何额外选项。
  3. 第一个强制参数应该指定章节的标题。
  4. 第二个强制参数应该提供要包含的 PDF 文件。

显然,这并没有经过真正的测试。我检查过它是否适用于我的示例以及我省略可选参数的情况,但仅此而已。买者自负。

编辑:我已经更新了代码,以回答评论中有关单页 PDF 的问题。\mysingpdf就像\myincpdf但它只包含 PDF 的第一页。对于单页文档或仅希望包含第一页的情况,请使用此命令。

相关内容