我只谈论article
文档类,因为report
它们book
以不同的方式处理标题。
显然,titlepage
环境会在它之后触发一个新页面,并将页面计数器重置为从 1 开始。只要您不在\maketitle
上使用titlepage
,页面样式就会设置为empty
,即标题页上不显示页码。但是,如果您\maketitle
在环境中使用titlepage
,则会将页面样式再次设置为plain
(页脚中的页码),从而产生两个连续的页面,编号为“1”。
如果我们更进一步并使用hyperref
,这是一个非常标准的包,我们会收到关于页码 1 被使用两次的警告:
pdfTeX 警告 (ext4): 具有相同标识符 (name{page.1}) 的目标具有 已被使用,重复项被忽略
这表明titlepage
内部引用是如何稍微混乱的。
这个问题不是关于如何修复titlepage
混乱的事情,我已经把所有问题都弄清楚了;我更想知道在非平凡文档中使用有什么意义——除了源代码中很好的语义标记。考虑到我必须修复页码,我titlepage
也可以使用。所以:\newpage
环境究竟起什么作用titlepage
以及它有什么好处?
如果你想看看我描述的现象,这里有一个 MWE 供你复制。% *
注释掉附加的行可能会很有趣。
\documentclass{article}
\usepackage{hyperref}% *
\author{John Doe}
\title{Foo Bar}
\begin{document}
\begin{titlepage}
\maketitle% *
Baz
\end{titlepage}
Hello World
\end{document}
编辑:
感谢 Werner 的回答。不过我还没有接受,因为我对有些事情仍然不太清楚。让我澄清一下我的问题——如果 Werner 或其他人能详细说明一下就好了:
titlepage
环境(不是文档类选项)到底起什么作用article
?它会改变哪些宏和环境以及如何改变?我研究过,article.cls
但并不理解所有相关部分。- 毕竟,使用这个环境有什么意义呢?我为什么不直接
\newpage
在标题页后面写呢?
编辑2:
titlepage
如果您本人确实在使用该环境并且能看到一个可以有效利用该环境的小例子,那将会很有趣。
答案1
作为@Marco在他的评论中提到,“每个文档类”都提供了titlepage
环境——你不会发现它是latex.ltx
但是,最好按照类文件中的定义来查看这些宏和环境:article.cls
,book.cls
和report.cls
。
然而,一些讨论也是有必要的。
当查看titlepage
这些文档类中的环境时,它仅提供一些其他宏/环境使用的外壳。例如,设置 documentclass 选项titlepage
(或notitlepage
)会修改 的定义方式titlepage
。此选项还会影响环境的排版方式abstract
,因为它是在 内部完成的titlepage
。此外,是使用为 documentclass 设置的此选项\maketitle
在 内部排版的。titlepage
最后,\maketitle
是一个宏,使用后会“自毁”,因为它的定义包含\global\let\maketitle\relax
在最后。所以,你使用它和你会失去它。而环境的使用titlepage
远远超出了\maketitle
;因此它在文档的其他部分用作包装器。并且,上述定义在文档类中是相似的。
在用法上\maketitle
和的区别titlepage
: 不应混淆。
编辑:
article.cls
(以及其他book.cls
和report.cls
文档类)根据兼容性条件启动其许多基本功能的加载\if@compatibility
。也就是说,某些选项/宏/环境仅在 时可用\@compatibilitytrue
,反之亦然。如果您想要一个低调的版本article.cls
,请使用\makeatletter\@compatibilitytrue\makeatother \documentclass{article}
默认使用 加载article
,\@compatibilityfalse
只是完全忽略了兼容性要求。有关此主题的完整讨论,请参阅@compatibility 条件有什么用?。此条件还控制环境的声明titlepage
。假设按原样加载标准文档类,则titlepage
定义如下:
\newenvironment{titlepage}
{\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse\newpage
\fi
\thispagestyle{empty}%
\setcounter{page}\@ne
}%
{\if@restonecol\twocolumn \else \newpage \fi
\if@twoside\else
\setcounter{page}\@ne
\fi
}
由此可以清楚地看出,(传统)titlepage
环境会执行以下操作
- 在
\begin{titlepage}
:- 判断文档是否处于
twocolumn
模式。如果是(\@twocolumntrue
),则切换到单列模式(\onecolumn
)并设置标志以恢复为双列模式\@restonecoltrue
。否则,如果已经处于单列模式,则发出\newpage
; - 清除页面标题
\thispagestyle{empty}
;以及 - 将页计数器设置为一
\setcounter{page}{@ne}
。
- 判断文档是否处于
- 在
\end{titlepage}
:- 如果需要则恢复两列模式(设置为
\begin{titlepage}
),或者发出另一个\newpage
;并且 twoside
如果不处于模式,则将页面计数器重置为一\setcounter{page}{@ne}
。
- 如果需要则恢复两列模式(设置为
本质上,titlepage
它适用于没有标题的单列页面。您可以自由地在其中做您想做的事情。也许这也回答了您的第二个问题。
答案2
你可以解决这两个问题,即标题页上的页码和来自超链接通过说
\begin{titlepage}
\maketitle
\thispagestyle{empty}
\setcounter{page}{0}
\end{titlepage}
\end{titlepage}
下一页的页码将设置为 1 。
问题在于:
\maketitle
发出一项\thispagestyle{plain}
指令,我们可以用另一项指令来撤销该指令\thispagestyle
;- 超链接不喜欢有两页相同的页码,无论是否打印出来;将页码设置为 0 可以解决这个问题。
这简要解释了如何应对使用环境的主要问题超链接。现在我来谈谈为什么提供这样的环境文章。许多学术机构习惯用纸板封面收集预印本;一个小窗口显示标题。在环境中,titlepage
作者可以放置数据,使其正确显示,而无需篡改命令\maketitle
。