当标准的article/book/report类提供的environment不够用时,可以使用newenvironment/renewenvironment定义新的环境,其语法格式为:
\newenvironment{新环境名称}[参数个数][参数默认值]{开始部分定义}{结束部分定义} \renewenvironment{新环境名称}[参数个数][参数默认值]{开始部分定义}{结束部分定义}其中参数的用法和\newcommand 相同,最多允许9个参数,顺序使用#1、#2等引用参数。如果没有使用参数,则[0]可以省略。假设myenv环境的调用如下:
\begin{myenv}{arg_1}…{arg_k}则可以在“开始部分定义”中使用#1,…#k来引用参数,这是newenvironment传递参数的方式。需要特别注意的是,newenvironment的参数只有在“开始部分定义”中才能使用,即“结束部分定义”中的代码无法获取参数。因此,如果要在“结束部分定义”中使用新环境的参数,必须在“开始部分定义”中保存到寄存器中,比如通过\newsavebox 和\sbox 等命令。
举例
先看一个简单的文章“摘要”(Abstract)的例子:假设,摘要的标题—摘要(Abstract)两个字加粗居中显示,正文使用quote格式,完整的示例文件参见2。\documentclass{article} \pagestyle{empty} \setlength\textwidth{3in}%限制文本宽度使得较少的文字就容易看出断行的效果 \newenvironment{Abstract}{ \begin{center}\normalfont\bfseries Abstract\end{center} \begin{quote}\par }%开始部分定义 {\end{quote}}%结束部分定义 \begin{document} \begin{Abstract} This abstract explain the approach userd to solve the problems at hand. \end{Abstract} Some text following the abstract. Some text following the abstract. Some text following the abstract. \end{document}其结果如1所示。
图 1: 摘要环境执行结果
下面设计一个带参数的环境,用于在文中引用名言警句。名言警句的格式要求:使用序号标记名言警句,在名言警句的右对齐末尾注明出处,完整的示意文件如1所示,效果如2所示。 这个例子值得深入探讨一下。首先,由于名言警句需要编号,因此首先定义了一个计数器CitCtr,在每次进入这个环境时该计数器自动增长(stepcounter),这样就获得了一个全局有效的名言警句的序号了,可以通过\arabic{CitCtr} 获取此序号的数字形式。其次,由于名言的出处在最后才会显示,我们在环境的结束定义部分无法获取名言的出处,因此需要在环境的开始定义部分使用\newsavebox 创建一个寄存器暂存名言出处(来自参数),这样在环境的结束定义部分才能够拿到名言出处,并按照指定的格式显示出来。对于名言出处的断行处理也值得研究一下—由于TeX默认的断行策略中有所谓的“末两行使用连字符”的惩罚因子(finalhyphendemerits ),即如果在段落的最末两行发生使用连字符断行的情况则认为很不美观,默认的finalhyphendemerits=10000 ,这样会导致本例中最后一个名言出处可能和名言不在一行,即使在本行有足够的空间可以显示出处。解决这个问题的办法有两个,其一是设置finalhyphendemerits=0 ,明确告诉TeX,我不在乎末两行存在连字符断行;其二,在决定名言出处的格式时,使用\nolinebreak[3] 明确告诉LaTeX此处强烈不建议断行。读者可自行在LaTeX源文件中尝试这两种方法的效果,尤其注意观察\nolinebreak 设置1,2,3,4时的不同表现。\documentclass{article} \pagestyle{empty} \setlength\textwidth{3in} \newcounter{Citctr} \newsavebox{\Citename} \newenvironment{Citation}[1] {%begin part,每一次碰到newenvironment{Citation}都会执行 \sbox\Citename{\emph{#1}}%暂时保存#1到\Citename,在\end{Citation}时需要用到 \stepcounter{Citctr} \begin{description} \item[Citation \arabic{Citctr}] } {%end part \hspace*{\fill}\nolinebreak[3] \hspace*{\fill}%如果发生了断行,此设置保证\Citation是居右的。 %\finalhyphendemerits=0 \usebox{\Citename}%是begin{Citation}时保存起来的 \end{description} } \begin{document} \begin{Citation}{Protagoras} Man is the measure of all things. \end{Citation} This is some reguar text in between two Citation enviroments. \begin{Citation}{Blaise Pascal} On mourra seal. \end{Citation} More regular text.\ldots \begin{Citation}{William Pitt} Necessity is the plea for every infringement of human freedom. \end{Citation} \end{document}效果图如下: 选自:http://softlab.sdut.edu.cn/blog/subaochen/2017/07/%E8%AF%A6%E8%A7%A3newenvironment%E5%91%BD%E4%BB%A4/
发表评论 取消回复