环境 - 奇怪的行为

环境 - 奇怪的行为

我有这个文件:

\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}[...]其中选修的

更复杂的方法可以使用\NewEnvironfromenviron包和\NewDocumentEnvironmentfrom 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}

在此处输入图片描述

相关内容