This is just a partial answer (for a complete answer, go to the last exampe). I used the thmtools
package as a front-end for amsthm
to define a theorem-like structure.
The use of
\interlinepenalty 10000
in postheadhook
prevents pagebreaks as requested.
\documentclass{book}
\usepackage{xcolor}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{thmtools}
\usepackage{lipsum}
\colorlet{myred}{red!80!black}
\declaretheoremstyle[
spaceabove=\topsep, spacebelow=\topsep,
headfont=\normalfont\color{myred},
notefont=\mdseries\color{myred}, notebraces={(}{)},
bodyfont=\normalfont,
postheadspace=\newline,
headpunct=,
numberwithin=chapter,
postheadhook=\leavevmode%
\interlinepenalty 10000%
\vskip-1.3\baselineskip%
\noindent{\color{myred}\rule{\textwidth}{1pt}}%
\interlinepenalty 10000%
\vskip0.3\baselineskip\noindent,
qed=\textcolor{myred}{$\blacksquare$}
]{mystyle}
\declaretheorem[style=mystyle]{example}
\renewcommand\theexample{\thechapter-\arabic{example}}
\begin{document}
\chapter{Test Chapter}
%\lipsum[1-3]
\begin{example}
\lipsum*[2]
\end{example}
\end{document}
The only thing that remains unsolved is the positioning of the end-mark when the last line in the environment belongs to a displayed math expression. Quite frankly I wouldn't know how to conditionally change the end-mark placement.
Here's another possibility using this time the mdframed
package; the end-mark is provided using the \xqed
macro defined in the document linked in the page Theorems in AMS-LaTeX of the AMS-FAQ.:
\documentclass{book}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{amssymb}
\usepackage{lipsum}
\usepackage{etoolbox}
\newcommand{\xqed}[1]{%
\leavevmode\unskip\penalty9999 \hbox{}\nobreak\hfill
\quad\hbox{\ensuremath{#1}}}
\AtBeginEnvironment{example}{\stepcounter{example}}
\AtEndEnvironment{example}{\xqed{\textcolor{myred}{\blacksquare}}}
\colorlet{myred}{red!80!black}
\newmdenv[
hidealllines=true,
frametitle={Example~\theexample},
frametitlerule=true,
frametitlerulecolor=myred,
frametitlerulewidth=2pt,
frametitlefont=\bfseries\color{myred},
innerleftmargin=0pt,
innerrightmargin=0pt
]{example}
\newcounter{example}[chapter]
\renewcommand\theexample{\thechapter-\arabic{example}}
\begin{document}
\chapter{Test Chapter}
\begin{example}
\lipsum*[2]
\end{example}
\end{document}
Here's now a possible complete solution; instead of conditionally redefining the behaviour of the end-marks (which could be really difficult), the user can manually select the lexample
environment which behaves like example
, but placing the end-mark to the left:
\documentclass{book}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{etoolbox}
\newlength\mylen
\newcommand{\xxqed}[1]{%
\settowidth\mylen{$#1$}%
\vskip-2\baselineskip\hspace*{-\mylen}\llap{\hbox{\ensuremath{#1}}}%
}
\newcommand{\xqed}[1]{%
\leavevmode\unskip\penalty9999 \hbox{}\nobreak\hfill
\quad\hbox{\ensuremath{#1}}}
\AtBeginEnvironment{example}{\stepcounter{example}}
\AtEndEnvironment{example}{\xqed{\textcolor{myred}{\blacksquare}}}
\AtBeginEnvironment{lexample}{\stepcounter{example}}
\AtEndEnvironment{lexample}{\xxqed{\textcolor{myred}{\blacksquare}}}
\colorlet{myred}{red!80!black}
\newmdenv[
hidealllines=true,
frametitle={Example~\theexample},
frametitlerule=true,
frametitlerulecolor=myred,
frametitlerulewidth=2pt,
frametitlefont=\bfseries\color{myred},
innerleftmargin=0pt,
innerrightmargin=0pt,
skipabove=.6\topskip,
skipbelow=.6\topskip
]{lexample}
\newmdenv[
hidealllines=true,
frametitle={Example~\theexample},
frametitlerule=true,
frametitlerulecolor=myred,
frametitlerulewidth=2pt,
frametitlefont=\bfseries\color{myred},
innerleftmargin=0pt,
innerrightmargin=0pt,
skipabove=.6\topskip,
skipbelow=.6\topskip
]{example}
\newcounter{example}[chapter]
\renewcommand\theexample{\thechapter-\arabic{example}}
\newcommand\Text{% just to generate text for the example
Quisque ullamcorper placerat ipsum. Cras nibh. Morbi vel justo vitae lacus
tincidunt ultrices. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In
hac habitasse platea dictumst. Integer tempus convallis augue. Etiam facilisis.
Nunc elementum fermentum wisi. Aenean placerat. Ut imperdiet, enim sed
gravida sollicitudin, felis odio placerat quam, ac pulvinar elit purus eget enim.
Nunc vitae tortor. Proin tempus nibh sit amet nisl.
}
\begin{document}
\chapter{Test Chapter}
\begin{lexample}
\Text
\begin{align}
a &= b \\
&= c
\end{align}
\end{lexample}
\Text
\begin{example}
\Text
\end{example}
\end{document}
Best Answer
This sort of works; at least, the output is the same (albeit disputable).
When you wrap
align
in some other environment, you need to use the “inner form”, not with\begin
and\end
.A generic environment where the desired one is given as argument.
You might need to add
\usepackage{xparse}
if your LaTeX release is earlier than 2020-10-01.