Как определить команду, которая могла бы генерировать похожие среды, как это делает \newtheorem?

Как определить команду, которая могла бы генерировать похожие среды, как это делает \newtheorem?

Хорошо известно, что встроенная команда LaTeX \newtheoremможет генерировать ряд похожих сред теорем: они имеют одинаковую тему стиля макета, но отличаются названием, стилем счетчика и т. д.

Я определил цветное текстовое поле, которое используется для вывода красивого стиля классной заметки, используя TiкZ недавно. Хотя этот конкретный стиль меня удовлетворил, он также принес мне некоторые неудобства. Поскольку я хочу поместить определение, лемму и заключение, например, в разные, но похожие стили, мне приходится определять такие среды одну за другой, используя более десяти строк кода.

MWE здесь:

\documentclass{book}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage{environ}
\usepackage{amsmath,mathrsfs,amsfonts}

\usetikzlibrary{shapes,decorations}
\definecolor{bule}{RGB}{18,29,57}
\definecolor{bablue}{RGB}{248,248,248}
\definecolor{main}{RGB}{127,191,51}
\definecolor{seco}{RGB}{0,145,215}
\definecolor{thid}{RGB}{180,27,131}

%define the style of tikz newthemsty
\tikzstyle{newthemsty} 
          =[draw=seco, fill=blue!10,very thick,rectangle,
           rounded corners, inner sep=10pt, inner ysep=20pt]
\tikzstyle{newthemstytitle}
          =[fill=seco, text=blue!10]

%%define the "newthem" environment
\newcounter{Newthem}[chapter]
\renewcommand{\theNewthem}{\thechapter.\arabic{Newthem}}
\NewEnviron{newthem}[1][{}]{%
\noindent\centering
\begin{tikzpicture}
\node[newthemsty] (box){
     \begin{minipage}{0.93\columnwidth}
        \sffamily\BODY
     \end{minipage}};
\node[newthemstytitle,right=10pt] at (box.north west){
     \bfseries\textsf{Theorem \stepcounter{Newthem}\theNewthem\; #1}};
\node[newthemstytitle, rounded corners] at (box.east) {$\clubsuit$};
\end{tikzpicture}
}[\par\vspace{.5\baselineskip}]

\begin{document}

\begin{newthem}
    test
\end{newthem}

\end{document}

И его вывод:

введите описание изображения здесь

Если мне нужна команда, которая могла бы определять такую ​​среду, и я могу изменять цвет (фона и края), форму шрифта (курсив или прямая линия) и серию (жирная или нет), имя в метке (например, «теорема») и счетчик (внутри другого счетчика или без него), что мне делать?

Будем признательны за любые подсказки и намеки.

решение1

То, что вы хотите сделать, это обернуть ваш код в другой макрос, который будет принимать имя и некоторые настройки для управления цветом и стилем. Здесь я пытаюсь грубо имитировать \newtheoremи \theoremstyle.

\documentclass{book}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage{environ}
\usepackage{amsmath,mathrsfs,amsfonts}
\usepackage{xparse}

\usetikzlibrary{shapes,decorations}
\definecolor{bule}{RGB}{18,29,57}
\definecolor{bablue}{RGB}{248,248,248}
\definecolor{main}{RGB}{127,191,51}
\definecolor{seco}{RGB}{0,145,215}
\definecolor{thid}{RGB}{180,27,131}


\newcommand{\newfancytheoremstyle}[5]{%
  \tikzset{#1/.style={draw=#3, fill=#2,very thick,rectangle,
      rounded corners, inner sep=10pt, inner ysep=20pt}}
  \tikzset{#1title/.style={fill=#3, text=#2}}
  \expandafter\def\csname #1headstyle\endcsname{#4}
  \expandafter\def\csname #1bodystyle\endcsname{#5}
}

\newfancytheoremstyle{fancythrm}{blue!10}{seco}{\bfseries\sffamily}{\sffamily}

\makeatletter
\DeclareDocumentCommand{\newfancytheorem}{ O{\@empty} m m m O{fancythrm} }{%
  % define the counter for the theorem
  \ifx#1\@empty
    \newcounter{#2}
  \else
    \newcounter{#2}[#1]
    \numberwithin{#2}{#1}
  \fi
  %% define the "newthem" environment
  \NewEnviron{#2}[1][{}]{%
    \noindent\centering
    \begin{tikzpicture}
      \node[#5] (box){
        \begin{minipage}{0.93\columnwidth}
          \csname #5bodystyle\endcsname \BODY~##1
        \end{minipage}};
      \node[#5title, right=10pt] at (box.north west){
        {\csname #5headstyle\endcsname #3 \stepcounter{#2}\csname the#2\endcsname\; ##1}};
      \node[#5title, rounded corners] at (box.east) {#4};
    \end{tikzpicture}
  }[\par\vspace{.5\baselineskip}]
}
\makeatother

% Define new styles
% \newfancytheoremstyle{<name>}{inner color}{outer color}{head style}{body style}
\newfancytheoremstyle{fancydef}{green!10}{green}{\itshape\sffamily}{\sffamily}

% Define some new environments
% \newfancytheorem[<number within>]{<name>}{<head>}{<symbol>}[<style>]
\newfancytheorem[chapter]{newthem}{Theorem}{$\clubsuit$}
\newfancytheorem[section]{newcor}{Corollary}{$\heartsuit$}

\newfancytheorem{newdef}{Definition}{$\spadesuit$}[fancydef]

\begin{document}

\begin{newthem}
    test
\end{newthem}

\begin{newcor}
  test
\end{newcor}

\begin{newdef}
  test
\end{newdef}

\end{document}

выход

Используйте \newfancytheoremstyleмакрос для определения стиля (цвета и шрифты) и \newfancytheoremопределения новой среды. Я использую xparseдля работы с несколькими аргументами опций. Обратите внимание, что аргумент «внутренней» среды упоминается с помощью ##1вместо #1.

Связанный контент