一种LaTeX类文件 (cls) 与主文件 (tex)的参数传递方法

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节即可。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值