
Хорошо известно, что встроенная команда 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
.