LaTeX 自定义时一些特殊环境的应用

LaTeX\LaTeX 中,某些环境的使用比较特殊,在 \begin{<env>} 会直接去寻找 \end{<env>},而这个 \end{<env>} 不可以隐藏在其他的参数或宏里面。在进行自定义时必须注意到它们的特性。本文将介绍自定义命令和环境时,对这种环境的处理方法。

具有这样性质的环境包括 tabularxtablefigure 等。我们知道在 LaTeX\LaTeX 中,环境的用法是使用一对宏命令 \begin{<env>}\end{<env>} 来表示环境的起止,而 \begin{<env>} 展开后的宏命令是以 \<env> 开始,\end{<env>} 展开是以 \end<env>结束,这样,我们在定义新环境时,如果需要使用这类环境,就不能把 \begin{<env>}\end{<env>} 分别放到自定义环境的前后参数,而需要用 \<env>\end<env> 替代 \begin{<env>} \end{<env>},如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\documentclass{article}
\usepackage{booktabs,tabularx}
\newenvironment{mytable}{
\table[ht]
\centering
\tabularx{\textwidth}{lXr}
\toprule
Name & Address & E-mail\\
\midrule
}{\bottomrule\endtabularx\endtable}
\begin{document}
\begin{mytable}
Foo & 111 Example Street & example@mail.example.net\\
\end{mytable}
\end{document}

或者,可以考虑把这类环境完整地放入一个参数中,使用其他参数输入需要输入的内容,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
\documentclass{article}
\usepackage{booktabs,tabularx}
\usepackage{xparse}
\NewDocumentEnvironment{mytable}{O{htbp} +b }{
\begin{table}[#1]
\centering
\begin{tabularx}{\textwidth}{lXr}
\toprule
Name & Address & E-mail\\
\midrule
#2
\bottomrule
\end{tabularx}
\end{table}
}{}

\begin{document}
\begin{mytable}[ht]
Foo & 111 Example Street & example@mail.example.net\\
\end{mytable}
\end{document}

二者实现同样的效果:
效果

beamer 包中的 frame 也是这样一种环境,因此,在使用 markdown 宏包来简化 beamer 文档源文件输入的时候,一般不能把 \begin{frame}\end{frame} 设置隐藏在 markdown 格式中,而 block 环境没有这种特点,可以将其分别设置隐藏在 markdown 格式中,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
\documentclass{ctexbeamer}
\usepackage[footnotes,definitionLists,hashEnumerators,smartEllipses,tightLists=false,hybrid]{markdown}
\markdownSetup{rendererPrototypes={
headingThree = {\frametitle{#1}},
headingFour = {\begin{block}{#1}},
horizontalRule = {\end{block}}
}}

\begin{document}
\begin{markdown}
\begin{frame}

### 简介

* 首先要说的是……
* 再来呢……
- 不要忽略……
- 更要记得……

#### 小提醒

注意这个

----

\end{frame}
\end{markdown}
\end{document}

实现效果如下:
效果

感谢拨冗阅读本文,若有些许收获,不妨捐赠以资鼓励。