¿Cómo definir un comando que pueda generar entornos similares tal como lo hace \newtheorem?

¿Cómo definir un comando que pueda generar entornos similares tal como lo hace \newtheorem?

Es bien sabido que el comando incorporado de LaTeX \newtheorempodría generar una serie de entornos de teoremas que son similares: comparten el mismo tema de estilo de diseño pero difieren en su nombre y estilo de contador, etc.

Definí un cuadro de texto de color, que se usa para generar un estilo elegante de nota de clase, usando TikZ recientemente. Aunque el estilo específico me satisfizo, también me trajo algún tipo de inconveniente. Como quiero poner definición, lema y conclusión, por ejemplo, en estilos diferentes pero similares, tengo que definir dichos entornos uno por uno, usando más de diez líneas de código.

MWE está aquí:

\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}

Y su salida:

ingrese la descripción de la imagen aquí

Si quiero un comando que pueda definir dicho entorno y pueda modificar el color (de fondo y el borde), la forma de la fuente (cursiva o vertical) y la serie (negrita o no), el nombre en la etiqueta ( diga 'teorema' aquí) y el contador (dentro o sin otro contador), ¿qué debo hacer?

Se agradecería cualquier pista o sugerencia.

Respuesta1

Lo que quieres hacer es envolver tu código dentro de otra macro que tendrá un nombre y algunas configuraciones para controlar el color y el estilo. Aquí estoy tratando de imitar aproximadamente \newtheoremy \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}

producción

Utilice la \newfancytheoremstylemacro para definir un estilo (colores y fuentes) y \newfancytheorempara definir un nuevo entorno. Estoy usando xparsepara lidiar con los argumentos de opciones múltiples. Tenga en cuenta que se hace referencia al argumento del entorno "interno" con ##1en lugar de #1.

información relacionada