LaTeX 自定义修正 \title 和 \maketitle
使用到的命令
-
\makeatletter
...makeatother
\renewcommand*
\maketitle
随着最近使用 增多,感觉默认的
Article
的样式有些太单调。比如:
![](https://img.haomeiwen.com/i2242606/20d55a807c7f18c7.png)
基本概念
我们先看看精简的\maketitle
的定义:
\if@titlepage{ % 针对不分栏的情况,默认
\newcommand\maketitle{
\begin{titlepage}
\@title\par
\end{titlepage}
}
} else { % 针对页面分栏的情况
\newcomand\maketitle{
\begin{group}
\@title\par
\end{group}
}
我们的目的是缩减一些margin
,不放作者和时间行。注意一点:含有 @ 的命令是内部命令,不需要立即执行,需要配合 \makeatletter ... \makeatother
延迟,之后再执行。
解决方案是
\makeatletter % change default title style
\renewcommand*\maketitle{%
\begin{center}% 居中标题
\bfseries % 默认粗体
{\LARGE \@title \par} % LARGE字号
\vskip 1em% %%% 标题下面只有1em的缩进或margin
{\global\let\author\@empty}%
{\global\let\date\@empty}%
\thispagestyle{empty} % 不设置页面样式
\end{center}%
\setcounter{footnote}{0}%
}
\makeatother
![](https://img.haomeiwen.com/i2242606/7ef0d28a56d04980.png)
这样的方式有点粗暴,还有更简单的方案,就是 \title
、\date
、 \author
空置,然后另外定义一个标题,然后放到正文中。我的方案有点 hard,但是了解一下内部命令,算做是一种学习吧。
article.cls
中\maketitle
的定义:
\if@titlepage
\newcommand\maketitle{\begin{titlepage}%
\let\footnotesize\small
\let\footnoterule\relax
\let \footnote \thanks
\null\vfil
\vskip 60\p@
\begin{center}%
{\LARGE \@title \par}%
\vskip 3em%
{\large
\lineskip .75em%
\begin{tabular}[t]{c}%
\@author
\end{tabular}\par}%
\vskip 1.5em%
{\large \@date \par}% % Set date in \large size.
\end{center}\par
\@thanks
\vfil\null
\end{titlepage}%
\setcounter{footnote}{0}%
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@thanks\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
}
\else
\newcommand\maketitle{\par
\begingroup
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
\def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
\long\def\@makefntext##1{\parindent 1em\noindent
\hb@xt@1.8em{%
\hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage
\global\@topnum\z@ % Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{plain}\@thanks
\endgroup
\setcounter{footnote}{0}%
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@maketitle\relax
\global\let\@thanks\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
}
参考
不需要专门的说明吧,我现在就可以说清楚了
\makeatletter
就是把@
当作普通字母处理,反之\makeatothe
r就是把@
当作一般符号处理,由于内部命令有
@
,所以需要\makeatletter
把@
当作字母,每个字符都有分类(可以用\catcode
改)的,你可以参看TeXbookhttp://bbs.ctex.org/forum.php?mod=viewthread&tid=26525&highlight=makeatletter
\makeatletter
changes the category code of'@'
character to11
(which is the catcode of ordinarary characters a-z,A-Z).
\makeatother
reverts this to its original catcode of12
.Knuth assigns a category code for each and every character like:
0
for escape\
,1
for begining of a group{
,2
for end of group}
,3
for math shift$
,4
for alignmet tab&
,5
for end ofline
,6
for paramter#
,7
for superscript^
,8
for subscript_
,9
forignored character
,10
forspace
,11
forletters
,13
for active character~
,14
for comment character%
,15
forinvalid character
12
for characters other than the above.https://www.tug.org/pipermail/tugindia/2002-January/000178.html