![定义接受参数的环境](https://linux22.com/image/246969/%E5%AE%9A%E4%B9%89%E6%8E%A5%E5%8F%97%E5%8F%82%E6%95%B0%E7%9A%84%E7%8E%AF%E5%A2%83.png)
我想定义一个接受文本参数的新环境并将其用作标题。
\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.}}{}
我声明了两个环境,enva
和envb
。第一个环境有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}