[Tex/LaTex] define a new Example environment

environmentsexamples

how can i define a new Example environment like the image shown in the following?

this environment should have the following attributes:

  • endmarks must be positioned at the last line, whether it includes text or formula; but in formula mode, the red square must be positioned at left side.
  • if the word Example and its red sub-line arrive at the end of page, and there was no more space to include the body of example, the whole example must be inserted at next page (the section, subsection, ... have this property by default).

enter image description here

Best Answer

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}

enter image description here

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}

enter image description here

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}

enter image description here

Related Question