如何在新命令中编写多参数环境?

如何在新命令中编写多参数环境?

在我的自定义类文件中,我有一个生成新环境的命令:

\newcommand{\MakeThEnv}[4]{

\DefaultFrame{#1}{#2}

\theoremstyle{#3}
\newtheorem{#2T}{#4}

\newenvironment{#2}{\begin{#2Box}\begin{#2T}}{\end{#2T}\end{#2Box}}

在颜色中创建\DefaultFrame{color}{blabla}环境。但出于另一个目的,我创建了一个“多项”环境命令blablaBoxcolor

\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][]

定义环境时,使用一个可选参数(默认情况下为空)和一个必需参数。然后,使用##1and在环境定义中引用这些参数##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

相关内容