更改页面、章节、图表等标识符以避免重复

更改页面、章节、图表等标识符以避免重复

假设您要构建一份由多篇论文组成的报告。在每篇论文开始前,titlepage应显示。此外,在每篇论文开始前,应始终重置页码、章节号、图表编号等。

使用我的解决方案并使用pdftex驱动程序进行编译,我得到了几个

pdfTeX 警告(ext4):具有相同标识符(name{page.1})的目标已被使用,重复项被忽略

或者

pdfTeX 警告(ext4):具有相同标识符(name{section.1})的目标已被使用,重复项被忽略

我在这里看到很多例子,例如,pdfTeX 警告(ext4):具有相同标识符(name{page.1})的目标已被使用,重复项被忽略。但它们并不能满足我的所有要求。

\documentclass{article}

\usepackage{hyperref}

\newcommand{\inserttitlepage}
{
    \setcounter{table}{0} % reset counters
    \setcounter{figure}{0}
    \setcounter{section}{0}
    \begin{titlepage}
        bla
     \end{titlepage}
}

\begin{document}

\inserttitlepage

% Paper 1
\section{Introduction}
\section{Conclusion}

\inserttitlepage

% Paper 2
\section{Introduction}
\section{Conclusion}

\end{document}

所以我想......我可以定义一些自定义标识符,它可以是随机的,并且在每个titlepage会影响每个页面、图形、部分等之前定义,这样就不会存在重复的标识符。

准确地说...我可以更改name{page.1}name{pageaaa.1}或者name{pagebbb.1}或者其他任何东西吗?

答案1

锚点名称page.<n>有多种用途;由于您有多个“页面 1”,因此唯一的方法似乎是添加选项pageanchor=false

对于其他可能具有重复值的计数器,使用H技巧并定义一个titlepage计数器。

\documentclass{article}

\usepackage{chngcntr}
\usepackage[pageanchor=false]{hyperref}

\newcounter{titlepage}
\renewcommand{\theHtable}{\thetitlepage.\arabic{table}}
\renewcommand{\theHfigure}{\thetitlepage.\arabic{figure}}
\renewcommand{\theHsection}{\thetitlepage.\arabic{section}}
\counterwithin*{section}{titlepage}
\counterwithin*{table}{titlepage}
\counterwithin*{figure}{titlepage}

\newcommand{\inserttitlepage}{%
  \begin{titlepage}
  \stepcounter{titlepage}%
  bla
  \end{titlepage}
}

\begin{document}

\inserttitlepage

% Paper 1
\section{Introduction}
\section{Conclusion}

\begin{figure}[htp]
\caption{A}
\end{figure}
\begin{table}[htp]
\caption{B}
\end{table}

\inserttitlepage

% Paper 2
\section{Introduction}
\section{Conclusion}
\begin{figure}[htp]
\caption{A}
\end{figure}
\begin{table}[htp]
\caption{B}
\end{table}

\end{document}

答案2

已经给出的两个答案分别解决了问题的不同方面,但都无法解决所有问题。

hyperref包可以\pdfdest通过多种方式为文档中的节点(“目标锚点”)生成名称;它默认使用的方式是分配由部分单元名称构成的名称,例如section或文档元素,例如page以及相关计数器的文本表示,例如或。如果你追踪 pdfTeX 构建的框的内容,你就会看到这一点:例如,如果你\thesection\thepage

\tracingoutput = 1

在你的文档中,你会发现,在你的成绩单文件中,有如下几行

....\pdfdest name{section.1} xyz

对于与章节标题绑定的锚点,或者像这样

...\pdfdest name{page.1} xyz

对于绑定到页面的锚点(请注意,为了查看绑定到页面的锚点,您需要追踪“正在运出的完整箱子”,即使用\tracingoutput,就像我们上面所做的那样)。但是,为了访问用于此目的的计数器的文本表示,该hyperref包不会直接使用其关联的宏形式\the<countername>例如,,\thesection而是一个以模式命名的宏\theH<countername>例如\theHsection;像这样的宏的默认定义\theHsection是由包本身设置的,并且\theHsection只是 的别名\thesection,但您可以自由更改此默认定义,以更改用于构建锚点的计数器的表示,而不会影响将用于打印文本的表示。 Christian 的解决方案基于这种方法。 让我回顾一下并简要讨论一下它的优缺点:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{hyperref}

% Christian's answer:
\newcounter{papernum}
\renewcommand*{\theHsection}{\arabic{papernum}.\arabic{section}}
\renewcommand*{\theHfigure} {\arabic{papernum}.\arabic{figure}}
\renewcommand*{\theHtable}  {\arabic{papernum}.\arabic{table}}
% ... and so on for subsection, subsubsection, etc., if you use them
% E.g., for the subsection counter:
% \renewcommand*{\theHsubsection}{\arabic{papernum}.\arabic{subsection}}

\newcommand{\inserttitlepage}
{
    \stepcounter{papernum}
    \setcounter{table}{0} % reset counters
    \setcounter{figure}{0}
    \setcounter{section}{0}
    \begin{titlepage}
        bla
    \end{titlepage}
}

% \showboxbreadth = 1000
% \showboxdepth = 10
% \tracingoutput = 1



\begin{document}

\inserttitlepage

% Paper 1
\section{Introduction}
\label{S:1-Intro}
Intro~1.  See also Section~\ref{S:1-Concl}, and, from the second paper,
Sections \ref{S:2-Intro} and~\ref{S:2-Concl}.

\section{Conclusion}
\label{S:1-Concl}
Concl~1.  See also Section~\ref{S:1-Intro}, and, from the second paper,
Sections \ref{S:2-Intro} and~\ref{S:2-Concl}.

\inserttitlepage

% Paper 2
\section{Introduction}
\label{S:2-Intro}
Intro~2.  See also Section~\ref{S:2-Concl}, and, from the first paper,
Sections \ref{S:1-Intro} and~\ref{S:1-Concl}.

\section{Conclusion}
\label{S:2-Concl}
Concl~2.  See also Section~\ref{S:2-Intro}, and, from the first paper,
Sections \ref{S:1-Intro} and~\ref{S:1-Concl}.

\bigskip

Go to page~\hyperpage{1}, \hyperpage{2}, \hyperpage{3},
or~\hyperpage{4} (the latter should be this same page).

\end{document}

优点:

  • 它消除了关于双重定义的“section-type”锚点的警告;

  • 使得跨不同论文的章节标题交叉引用能够正确工作;

  • 它写入辅助文件的标签可以很容易地与相关的部分单元联系起来;

缺点:

  • 关于双重定义的“页面类型”锚点的警告仍然存在;

  • \hyperpage命令无法正常工作;特别是,不可能有索引。

注意这个\theH...技巧不能应用于page计数器,因为该hyperref包以与其他计数器不同的方式来处理这个特殊计数器(因为它实际上是 TeX 的原始寄存器\count0)。

接下来让我们考虑一下@egreg的回答,它只是建议完全关闭“页面类型”锚点的生成。当然,这根本不能解决其他类型锚点的问题,事实上,如果你编译以下(否则)MWE,你仍然会收到几个警告:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}

% egreg's answer:
\usepackage[pageanchor=false]{hyperref}

\newcommand{\inserttitlepage}
{
    \setcounter{table}{0} % reset counters
    \setcounter{figure}{0}
    \setcounter{section}{0}
    \begin{titlepage}
        bla
    \end{titlepage}
}

% \showboxbreadth = 1000
% \showboxdepth = 10
% \tracingoutput = 1



\begin{document}

\inserttitlepage

% Paper 1
\section{Introduction}
\label{S:1-Intro}
Intro~1.  See also Section~\ref{S:1-Concl}, and, from the second paper,
Sections \ref{S:2-Intro} and~\ref{S:2-Concl}.

\section{Conclusion}
\label{S:1-Concl}
Concl~1.  See also Section~\ref{S:1-Intro}, and, from the second paper,
Sections \ref{S:2-Intro} and~\ref{S:2-Concl}.

\inserttitlepage

% Paper 2
\section{Introduction}
\label{S:2-Intro}
Intro~2.  See also Section~\ref{S:2-Concl}, and, from the first paper,
Sections \ref{S:1-Intro} and~\ref{S:1-Concl}.

\section{Conclusion}
\label{S:2-Concl}
Concl~2.  See also Section~\ref{S:2-Intro}, and, from the first paper,
Sections \ref{S:1-Intro} and~\ref{S:1-Concl}.

\bigskip

Go to page~\hyperpage{1}, \hyperpage{2}, \hyperpage{3},
or~\hyperpage{4} (the latter should be this same page).

\end{document}

此外,在这种情况下,部分和命令之间的交叉引用\hyperpage仍然被破坏。但请注意,@egreg — 当然! :-) — 完全意识到了这一点,并明确建议对H “其他计数器”使用“技巧”。

但是,第三种解决方案是可能的:hypertex可以要求包完全忽略生成“section-type”锚点的计数器的值section,而使用内部生成的标签。此行为也适用于“页面类型”锚点;要请求它,您可以将hypertexnames=false其指定为选项或在参数中指定\hypersetup

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}

% Another possible solution:
\usepackage[hypertexnames=false]{hyperref}

\newcommand{\inserttitlepage}
{
    \setcounter{table}{0} % reset counters
    \setcounter{figure}{0}
    \setcounter{section}{0}
    \begin{titlepage}
        bla
    \end{titlepage}
}

% \showboxbreadth = 1000
% \showboxdepth = 10
% \tracingoutput = 1



\begin{document}

\inserttitlepage

% Paper 1
\section{Introduction}
\label{S:1-Intro}
Intro~1.  See also Section~\ref{S:1-Concl}, and, from the second paper,
Sections \ref{S:2-Intro} and~\ref{S:2-Concl}.

\section{Conclusion}
\label{S:1-Concl}
Concl~1.  See also Section~\ref{S:1-Intro}, and, from the second paper,
Sections \ref{S:2-Intro} and~\ref{S:2-Concl}.

\inserttitlepage

% Paper 2
\section{Introduction}
\label{S:2-Intro}
Intro~2.  See also Section~\ref{S:2-Concl}, and, from the first paper,
Sections \ref{S:1-Intro} and~\ref{S:1-Concl}.

\section{Conclusion}
\label{S:2-Concl}
Concl~2.  See also Section~\ref{S:2-Intro}, and, from the first paper,
Sections \ref{S:1-Intro} and~\ref{S:1-Concl}.

\bigskip

Go to page~\hyperpage{1}, \hyperpage{2}, \hyperpage{3},
or~\hyperpage{4} (the latter should be this same page).

\end{document}

如果你编译这个例子,你会注意到所有的警告都消失了,所有的交叉引用,包括由\hyperpage正常工作。 退税:写入辅助文件的锚点名称现在与相关部分单元的编号无关。

在上面发布的所有示例中,您可以取消注释诊断命令

% \showboxbreadth = 1000
% \showboxdepth = 10
% \tracingoutput = 1

以便准确检查每种情况下生成的锚点名称。

答案3

这只是一个有限的解决方案,但它为部分提供了正确的链接。关于等的警告page.1仍然存在!

一个解决方案是重新定义\theHsection命令以提供额外的数字(或名称,例如,迄今为止的标题页数)以获得唯一的锚点。

\documentclass{article}

\usepackage{hyperref}

\newcounter{titlepagecntr}

\newcommand{\inserttitlepage}
{
  \refstepcounter{titlepagecntr}
  \setcounter{table}{0} % reset counters
  \setcounter{figure}{0}
  \setcounter{section}{0}
  \renewcommand{\theHsection}{papersection.\thetitlepagecntr.\number\value{section}}
  \begin{titlepage}
    bla \thetitlepagecntr
  \end{titlepage}
}

\begin{document}
\inserttitlepage

% Paper 1
\section{Introduction \thetitlepagecntr}
\section{Conclusion \thetitlepagecntr}

\inserttitlepage

% Paper 2
\section{Introduction \thetitlepagecntr}
\section{Conclusion \thetitlepagecntr}

\end{document}

相关内容