定义接受参数的环境

定义接受参数的环境

我想定义一个接受文本参数的新环境并将其用作标题。

\documentclass{article}
\usepackage{amsthm}

\newenvironment{titleproof}
{\begin{proof} \textbf{Title of the Proof} \newline}
{\vspace*{0.5\baselineskip} \end{proof}}

\begin{document}
\begin{titleproof}

Here is my proof.

I want to be able to write something like ``begin\{titleproof\}\{New Title\}''
to customize the title of each different proof.

\end{titleproof}
\end{document}

澄清 我希望能够普遍做到这一点,而不仅仅是为了环境proof。以下是更清晰的 MWE:

\documentclass{article}

\newenvironment{titleenv}
{\textbf{Title of the Environment} \newline}
{\vspace*{0.5\baselineskip}}

\begin{document}
\begin{titleenv}

Here is my environment.

I want to be able to write something like ``begin\{titleenv\}[New Title]''
to customize the title of each different proof.

\end{titleenv}
\end{document}

答案1

你不需要任何特殊的东西:proof提供的环境amsthm允许一个可选参数

\begin{proof}[Title of this proof]
<the proof>
\end{proof}

我建议您遵循这条路径,这样删除可选参数就会保留标准\proofname

为了扩展这个主题,我们可以像命令一样用参数定义环境:

\newenvironment{foo}[2]
  {something with #1 and #2 to be performed at the beginning}
  {something to be performed at the end}

请注意,参数的占位符只能在“开始”部分使用。

您可以在每本 LaTeX 指南中找到示例,例如“不那么简短的指南”(texdoc lshort)。

上面定义的环境的一个例子是(使用括号表示参数,而不是像在证明环境中那样使用方括号):

\begin{foo}{arg1}{arg2}
some stuff in the middle
\end{foo}

生成

在开始时要执行一些带有 arg1 和 arg2 的操作

中间有一些东西

最后要做的事情

答案2

为了完整起见,我想提供另一个答案。这个答案使用了 amazing xparse。我们将用于声明新环境的命令是:

\DeclareDocumentEnvironment{<environment>}{<arg spec>}{<start code>}{<end code>}

最酷的部分是<arg spec>。在这里我们指定新环境将使用的参数类型。让我举个例子:

\DeclareDocumentEnvironment{enva}{O {cake} }{\textbf{I like #1.}}{}
\DeclareDocumentEnvironment{envb}{O {cake} m }{\textbf{I like #1 and #2.}}{}

我声明了两个环境,envaenvb。第一个环境有O {cake}作为参数规范。根据xparse文档第 2 页:

  • o\NoValue:一个标准的 LaTeX 可选参数,用方括号括起来,如果未给出,则将提供特殊标记。

  • O:与 相同o,但<default>如果未给出值则返回。应给出O{<default>}

第二个环境使用m

  • m:标准强制参数,可以是单个标记,也可以是用花括号括起来的多个标记。无论输入是什么,该参数都将传递给用括号对括起来的内部代码。这是xparse普通 TeX 参数的类型说明符。

我的完整示例:

\documentclass{article}

\usepackage{xparse}

\DeclareDocumentEnvironment{enva}{O {cake} }{\textbf{I like #1.}}{}
\DeclareDocumentEnvironment{envb}{O {cake} m }{\textbf{I like #1 and #2.}}{}

\begin{document}

\begin{enva}
Hello!
\end{enva}

\begin{enva}[ducks]
Hello!
\end{enva}

\begin{envb}{apples}
Hello!
\end{envb}

\begin{envb}[ducks]{apples}
Hello!
\end{envb}

\end{document}

输出:

有人说蛋糕吗?

就这样。:)

答案3

您可以使用类似定理的结构;在下面的示例中,我使用thmtools包作为前端来amsthm定制类似定理的环境:

\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{lipsum}

\declaretheoremstyle[
spaceabove=\topsep, spacebelow=\topsep,
headfont=\normalfont\itshape,
headpunct=.,
notefont=\normalfont\bfseries, notebraces={\hspace*{-4pt}}{},
bodyfont=\normalfont,
postheadspace=\newline,
numbered=no,
]{mystyle}
\declaretheorem[style=mystyle,name={}]{myenv}

\begin{document}

\begin{myenv}[Title one]
\lipsum[2]
\end{myenv}

\begin{myenv}[Title two]
\lipsum[2]
\end{myenv}

\end{document}

在此处输入图片描述

相关内容