假设您要构建一份由多篇论文组成的报告。在每篇论文开始前,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}