我有这个文件:
\documentclass{article}
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample. #1} \rmfamily}{\medskip}
\begin{document}
\begin{example}
Test
\end{example}
\end{document}
输出如下所示:
但是,如果我删除环境定义中的 [] (出现在 [1] 之后),我会得到
有人能向我解释为什么会发生这种情况以及 [1] 后面的括号 [] 实际上起什么作用吗?
答案1
环境定义实际上没有什么奇怪的——奇怪的是忽视 LaTeX 宏/环境调用语法的结果。
使用标准 LaTeX 宏,\newenvironment
基本上有四种定义example
环境的方法:
- 根本不使用任何参数,即
\newenvironment{foo}{start code}{end code}
使用强制参数,必须用一
{}
对括起来:\newenvironment{foobar}[1]{start code}{end code}
在定义中使用至少一个可选参数,并根据环境使用情况决定是否给出该参数:
\newenvironment{foobarother}[1][]{start code}{end code}
空
[]
表示可选参数值为空,即如果\begin{foobarother}
使用时没有[]
则为#1
空,否则将其指定为\begin{foobarother}[Foobar]
。
如果应该使用默认标题,比如“我的漂亮的默认标题”,那么 如果没有指定可选参数,则使用\newenvironment{foobarother}[1][My nice default title]{start code}{end code}
适用的标题。My nice default title
- 使用可选和强制参数,即
\newenvironment{yetanotherfoobar}[2][]{start code}{end code}
使用\begin{yetanotherfoobar}[Some other title]{Yet another foobar}
,[...]
其中选修的
更复杂的方法可以使用\NewEnviron
fromenviron
包和\NewDocumentEnvironment
from xparse
(例如)。请注意,#1
等不能在end code
用 定义的环境中使用\newenvironment
,但\NewDocumentEnvironment
和\NewEnviron
允许在环境的结束代码部分使用参数。
\documentclass{article}
\usepackage{etoolbox}
\newcounter{example}[section]
\newenvironment{examplewithoptarg}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample.\notblank{#1}{~#1}{}} \rmfamily}{\medskip}
\newenvironment{examplewitharg}[1]{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample. #1} \rmfamily}{\medskip}
\newenvironment{examplewithoutargument}{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample} \rmfamily}{\medskip}
\begin{document}
\begin{examplewithoptarg}% Empty optional argument
Test
\end{examplewithoptarg}
% Non-empty optional argument, title is My nice title
\begin{examplewithoptarg}[My nice title]
Test
\end{examplewithoptarg}
% Correct syntax for example with arg: Use `{Foo}` as argument and `Foo` as title, `Test` is the environment body content
\begin{examplewitharg}{Foo}
Test
\end{examplewitharg}
% 'Wrong' usage -- grabs F, regards it as title and then displays oo Test
\begin{examplewitharg}
Foo Test
\end{examplewitharg}
% No argument -- this has the standard title `Example \theexample` by definition
\begin{examplewithoutargument}
Test
\end{examplewithoutargument}
\end{document}