![如何在新命令中编写多参数环境?](https://linux22.com/image/446782/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%96%B0%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%BC%96%E5%86%99%E5%A4%9A%E5%8F%82%E6%95%B0%E7%8E%AF%E5%A2%83%EF%BC%9F.png)
在我的自定义类文件中,我有一个生成新环境的命令:
\newcommand{\MakeThEnv}[4]{
\DefaultFrame{#1}{#2}
\theoremstyle{#3}
\newtheorem{#2T}{#4}
\newenvironment{#2}{\begin{#2Box}\begin{#2T}}{\end{#2T}\end{#2Box}}
在颜色中创建\DefaultFrame{color}{blabla}
环境。但出于另一个目的,我创建了一个“多项”环境命令blablaBox
color
\newcommand{\MakeMultEnv}[4]
{
\DefaultFrameMult{#1}{#2}
\theoremstyle{#3}
\newtheorem*{#2Ts}{#4}
\newenvironment{#2s}
{
\begin{#2Boxs}
\begin{#2Ts}\hfill
\begin{enumerate}[wide, label=\textbf{\arabic*.}]
}
{
\end{enumerate}\end{#2Ts}\end{#2Boxs}
}
}
我想向#2s
环境添加一些可选参数(例如,添加标题并在之前添加序言\hfill
,并使其成为可选的)。我的梦想是做这样的事情:
\newenvironment{blablas}[2][1={},2=\hfill]{
\begin{blablaBoxs}
\begin{blablaTs}[#1]{#2}
\begin{enumerate}[wide, label=\textbf{\arabic*.}]}
{\end{enumerate}\end{blablaTs}\end{blablaBoxs}}
([1={},2=\hfill]
东西是从xargs
包裹里拿出来的。)但正如你所见,替换blabla
为#2
好像有问题……
这是一个可重现的例子
\documentclass{article}
\usepackage{amsthm}
\usepackage{mdframed}
\usepackage{xcolor}
\newcommand\DefaultFrame[2]{
\newmdenv[
skipabove=2pt,
skipbelow=2pt,
rightline=false,
leftline=true,
topline=false,
bottomline=false,
linecolor=#1,
linewidth=4pt,
]{#2Box}}
\newcommand\DefaultMultFrame[2]{
\newmdenv[
skipabove=2pt,
skipbelow=2pt,
rightline=false,
leftline=true,
topline=false,
bottomline=false,
linecolor=#1,
linewidth=4pt,
]{#2Boxs}}
\newcommand{\MakeThEnv}[3]{
\DefaultFrame{#1}{#2}
\theoremstyle{plain}
\newtheorem{#2T}{#3}
\newenvironment{#2}{\begin{#2Box}\begin{#2T}}{\end{#2T}\end{#2Box}}
}
\newcommand{\MakeMultThEnv}[3]{
\DefaultMultFrame{#1}{#2}
\theoremstyle{plain}
\newtheorem{#2Ts}{#3}
\newenvironment{#2s}
{\begin{#2Boxs}\begin{#2Ts}\hfill\begin{enumerate}}
{\end{enumerate}\end{#2Ts}\end{#2Boxs}}
}
\definecolor{maincolor}{HTML}{1d3557}
\MakeThEnv{maincolor}{theo}{Theorem}
\MakeMultThEnv{maincolor}{theo}{Theorems}
\pagestyle{empty}
\begin{document}
\begin{theo}[Me]
A theorem by me.
\end{theo}
\begin{theos}
\item First theorem.
\item Second theorem.
\end{theos}
\end{document}
结果如下:
我想要一个可以创建theos
环境的命令,但是在某些用途中我可以在其之前添加标题和序言enumerate
,如下所示:
\begin{theos}[Me]{Let $x$ a thing.}
\item First theorem.
\item Second theorem.
\end{theos}
为了得到这个:
感谢您的帮助。
答案1
您可以向您的添加参数\newenvironment
,例如
\newenvironment{#2s}[2][]
定义环境时,使用一个可选参数(默认情况下为空)和一个必需参数。然后,使用##1
and在环境定义中引用这些参数##2
;请注意 double 的使用#
。例如
\newenvironment{#2s}[2][]
{\begin{#2Boxs}\begin{#2Ts}[##1]##2\hfill\begin{enumerate}}
{\end{enumerate}\end{#2Ts}\end{#2Boxs}}
在您的示例代码中,这给出了
\documentclass{article}
\usepackage{amsthm}
\usepackage{mdframed}
\usepackage{xcolor}
\newcommand\DefaultFrame[2]{
\newmdenv[
skipabove=2pt,
skipbelow=2pt,
rightline=false,
leftline=true,
topline=false,
bottomline=false,
linecolor=#1,
linewidth=4pt,
]{#2Box}}
\newcommand\DefaultMultFrame[2]{
\newmdenv[
skipabove=2pt,
skipbelow=2pt,
rightline=false,
leftline=true,
topline=false,
bottomline=false,
linecolor=#1,
linewidth=4pt,
]{#2Boxs}}
\newcommand{\MakeThEnv}[3]{
\DefaultFrame{#1}{#2}
\theoremstyle{plain}
\newtheorem{#2T}{#3}
\newenvironment{#2}{\begin{#2Box}\begin{#2T}}{\end{#2T}\end{#2Box}}
}
\newcommand{\MakeMultThEnv}[3]{
\DefaultMultFrame{#1}{#2}
\theoremstyle{plain}
\newtheorem{#2Ts}{#3}
\newenvironment{#2s}[2][]
{\begin{#2Boxs}\begin{#2Ts}[##1]##2\hfill\begin{enumerate}}
{\end{enumerate}\end{#2Ts}\end{#2Boxs}}
}
\definecolor{maincolor}{HTML}{1d3557}
\MakeThEnv{maincolor}{theo}{Theorem}
\MakeMultThEnv{maincolor}{theo}{Theorems}
\pagestyle{empty}
\begin{document}
\begin{theo}[Me]
A theorem by me.
\end{theo}
\begin{theos}[Me]{}
\item First theorem.
\item Second theorem.
\end{theos}
\begin{theos}[Me]{Let \( x \) be a thing.}
\item First theorem.
\item Second theorem.
\end{theos}
\end{document}
如果你想要进行更复杂的参数解析,你可以研究一下新的xparse
派生命令,例如\NewDocumentEnvironment
。请参阅usrguide
文档,https://ctan.org/pkg/usrguide。