1 介绍
在设计论文模板时,通常的做法是按照需求设计出一个类文件 (以cls后缀),然后在主文件 (即书写论文的以tex为后缀的文件)调用该文件 (即将documentclass设为该cls文件名)。这样就做到了内容与格式的分离,cls文件主要负责版面格式,tex文件主要负责论文内容。
在tex文件中的内容需要用户以参数的形式送给某个命令,后台的
LATEX
引擎会根据该命令的名称做相应的处理,需要参数内容时,也会把该命令的参数内容提取出来。例如命令\section{引言}
。对这些类型的参数传递,我们不用额外做什么。因为在设计cls文件subcls时,通常会基于另外一种cls文件base;这个base文件通常会与Tex套件一起发布,是一个比较成熟的大家广泛使用的、得到认可的类。比较广泛使用的base文件可以是book、scrbook等,它们是设计学位论文模板的基础。在前人的肩膀上,我们设计自己需要的类文件时会少做很多的工作量。对于\section{引言}
之类的命令,base已经帮我们处理了。
有一些信息我们需要定制,然后在subcls中处理。需要完成的任务包括:
- 设计自己的指令,且带一个参数
\myop{< param>}
,该指令在tex文件中使用 (你也可以定义多个参数,为方便读者理解且不失完整性,本文以一个参数举例。); 将该命令的参数传递到subcls中,进行排版。
本所讲的是如何完成上述两个任务。通常的 LATEX 或者 TEX 书籍对相关的语法讲解的很详细,但没有将相关的知识点串接起来,面向一个具体任务。希望本文能给读者一个很好的启发。
2 方法
2.1 在subcls中设计一个带一个参数的命令
假如我们需要设计一个命令\finishdate{}
,该命令只接受一个参数,表示的是论文的完成日期。该命令的定义方法为:
%定义命令\finishdate{}
\newcommand{\@finishdate}{}
\newcommand{\finishdate}[1]{\renewcommand{\@finishdate}{#1}}
上面第一条语句定义了一个命令\@finishdate
,该命令执行体为空,即什么都不做;这条命令用于在subcls文件中提取命令\finishdate
的参数信息。第二条语句定义了一个命令\finishdate
,它含有一个参数,标记为1,该命令执行体的内容为对命令\@finishdate
进行重新定义,而此时参数1的内容变为\@finishdate
的执行体;命令\finishdate
在文件tex中使用。
上述代码片段的最终效果就是:\finishdate
可以在主文件tex中使用,并且只接受一个参数;该参数内容变为subcls文件中命令\@finishdate
的执行体,如果参数本身就是字符串信息,那么该执行体就显示该字符串。这样就完成了参数的传递。
关于\newcommand
的更多的语法细节,请参考相关的书籍和资料。
2.2 在subcls使用\@finishdate
为了使用的方便,对应不同cls和tex文件,我们自定义的命令采用这样的区分,在tex文件中使用的命令为\command
,而对于在subcls文件中使用的用于提取\command
参数的命令为\@command
。
在subcls文件使用\@finishdate
的方法举例:
\begin{center}
{\song\sihao\centerline{\@finishdate} \par} %日期
\end{center}
根据命令定义,\@finishdate
不带任何参数,所以直接使用就可以了。可以看出,我们在subcls文件设置了\finishdate
的参数的字体、字号、加下划线、居中等排版要求,而把内容本身留给命令\finishdate
的参数,等待用户在tex文件中输入。
2.3 在tex文件中使用命令\finishdate
在主文件tex中使用命令\finishdate
的代码片举例如下:
\documentclass[doctor]{subcls}
...
...
\begin{document}
\finishdate{2016 年\hspace{8mm}月\hspace{8mm}日} %答辩日期
\maketitle
...
\end{document}
因为根据定义,\finishdate
带有一个参数,所以我们就给该命令一个参数2016 年\hspace{8mm}月\hspace{8mm}日。注意,该参数内容中像2016 年之类的,本身为普通字符,编译后会原样显示;\hspace{8mm}本身是一个命令,根据定义 (\newcommand{\finishdate}[1]{\renewcommand{\@finishdate}{#1}}),该命令将会执行,打出一个字符间距,长度为8mm。从该例子中,可以看出\newtheorem
与\newcommand
的区别。不要轻视该例子的简单,它含有相当大的信息量。
3 运行结果
运行结果如下图:
达到了我们预期的目的。
4 结论
本文讨论了一种文件cls和tex之间参数传递的广泛使用的方法,该方法在国内许多高校的模板中大量使用。cls和tex分离是一种优秀的设计,是一种值得推荐的做法。如果不采用cls和tex相分离的做法,而采用其他方法,则不必使用本文方法。
本文的读者对象是模板的设计者,对于模板的使用者来说,仅仅按照模板的要求使用即可,即关注2.3节即可。