rtthesis-example.sty 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. \ProvidesPackage{rtthesis-example}[2010/02/18 The example environment of the rtthesis class]
  2. % Same dependency on rtthesis-captions as found in rtthesis-theorems.sty.
  3. \@ifpackageloaded{rtthesis-captions}{}{% If not loaded...
  4. \PackageError{rtthesis-example}{%
  5. The package rtthesis-captions must be loaded\MessageBreak
  6. before rtthesis-example. Since\MessageBreak
  7. rtthesis-example cannot guess which\MessageBreak
  8. character encoding you prefer, it won't\MessageBreak
  9. load rtthesis-captions for you, so you have\MessageBreak
  10. to do it yourself%
  11. }{%
  12. The package rtthesis-captions must be loaded\MessageBreak
  13. before rtthesis-example. Since\MessageBreak
  14. rtthesis-example cannot guess which\MessageBreak
  15. character encoding you prefer, it won't\MessageBreak
  16. load rtthesis-captions for you, so you have\MessageBreak
  17. to do it yourself%
  18. }
  19. }
  20. % Use same counter for theorem-like environments?
  21. \newif\ifrtex@shareTheoremCounter
  22. \DeclareOption{sharecounter}{\rtex@shareTheoremCountertrue}
  23. \DeclareOption{nosharecounter}{\rtex@shareTheoremCounterfalse}
  24. \ExecuteOptions{nosharecounter}
  25. % Use parskip.sty and adjust sectioning commands?
  26. \newif\ifrtex@parskip
  27. \newif\ifrtex@parskipDefault
  28. \rtex@parskipDefaulttrue
  29. \DeclareOption{noparskip}{\rtex@parskipfalse\rtex@parskipDefaultfalse}
  30. \DeclareOption{parskip}{\rtex@parskiptrue\rtex@parskipDefaultfalse}
  31. \@ifpackageloaded{parskip}{%
  32. \rtex@parskiptrue
  33. }{% In case KpFonts was not loaded:
  34. \rtex@parskipfalse
  35. \AtBeginDocument{%
  36. \ifrtex@parskipDefault
  37. \@ifpackageloaded{parskip}{%
  38. \PackageWarningNoLine{rtthesis-example}{%
  39. The default setting regarding `parskip' or\MessageBreak
  40. `noparskip' is `noparskip' since package\MessageBreak
  41. parskip was loaded after \MessageBreak
  42. rtthesis-example. This is probably not\MessageBreak
  43. what you want. Avoid this warning by\MessageBreak
  44. explicitly passing one of the options\MessageBreak
  45. `parskip' or `noparskip', or change the\MessageBreak
  46. package loading order
  47. }}{}%
  48. \fi
  49. }
  50. }
  51. % When should counters be reset?
  52. % Use same counter for theorem-like environments?
  53. \newif\ifrtex@resetchapter
  54. \DeclareOption{reset=chapter}{\rtex@resetchaptertrue}
  55. \DeclareOption{reset=section}{\rtex@resetchapterfalse}
  56. \@ifundefined{thechapter}{%
  57. \ExecuteOptions{reset=section}}{%
  58. \ExecuteOptions{reset=chapter}}
  59. \ProcessOptions\relax
  60. \RequirePackage{needspace}
  61. \DeclareRobustCommand*{\listofexamples}{%
  62. \section*{\listexamplename}%
  63. \@starttoc{xmp}%
  64. }
  65. \newcommand*{\l@example}{\l@figure}%
  66. \ifrtex@resetchapter
  67. \newcounter{Example}[chapter]%
  68. \renewcommand*{\theExample}{\thechapter.\arabic{Example}}%
  69. \else
  70. \newcounter{Example}[section]%
  71. \renewcommand*{\theExample}{\arabic{Example}}%
  72. \fi
  73. \newlength{\exampleLineWidth}
  74. \setlength{\exampleLineWidth}{.6pt}
  75. \newlength{\exampleTopBotInnerMargin}
  76. \setlength{\exampleTopBotInnerMargin}{2ex}
  77. \newlength{\exampleTopBotOuterMargin}
  78. \setlength{\exampleTopBotOuterMargin}{1em plus 1ex minus 1ex}
  79. \newenvironment{example}[1][]{%
  80. \ifrtex@shareTheoremCounter
  81. \refstepcounter{theorem}%
  82. \else
  83. \refstepcounter{Example}%
  84. \fi
  85. \sbox{\@tempboxa}{\ignorespaces#1\unskip}%
  86. \ifdim \wd\@tempboxa>\z@%
  87. \sbox{\@tempboxa}{%
  88. \textbf{%
  89. \ifrtex@shareTheoremCounter
  90. \thinspace\ignorespaces\examplename\unskip~\thetheorem:~#1\thinspace%
  91. \else
  92. \thinspace\ignorespaces\examplename\unskip~\theExample:~#1\thinspace%
  93. \fi
  94. }}%
  95. \else%
  96. \sbox{\@tempboxa}{\textbf{%
  97. \ifrtex@shareTheoremCounter
  98. \thinspace\ignorespaces\examplename~\thetheorem\thinspace
  99. \else
  100. \thinspace\ignorespaces\examplename~\theExample\thinspace
  101. \fi
  102. }}%
  103. \fi%
  104. \ifrtex@shareTheoremCounter
  105. \addcontentsline{xmp}{example}{\protect\numberline{\thetheorem}#1}%
  106. \else
  107. \addcontentsline{xmp}{example}{\protect\numberline{\theExample}#1}%
  108. \fi
  109. \@example%
  110. }%
  111. {\@endexample}
  112. \newenvironment{example*}[1][]{% Stared version w/o numbering
  113. \sbox{\@tempboxa}{\ignorespaces#1\unskip}%
  114. \ifdim \wd\@tempboxa>\z@%
  115. \sbox{\@tempboxa}{\textbf{%
  116. \thinspace\ignorespaces\examplename:~#1\thinspace}}%
  117. \else%
  118. \sbox{\@tempboxa}{\textbf{%
  119. \thinspace\examplename\thinspace}}%
  120. \fi%
  121. \@example%
  122. }%
  123. {\@endexample}
  124. \newlength{\rt@examplerulepos}
  125. \newcommand*\@example{% Start of example environmets
  126. \setlength{\@tempskipa}{\linewidth}%
  127. \addtolength{\@tempskipa}{-\wd\@tempboxa}%
  128. \addtolength{\@tempskipa}{-1em}%
  129. \par% Enforce vmode
  130. \addtolength{\exampleTopBotOuterMargin}{-\parskip}% Change temporarily to compensate for parskip
  131. \addvspace{\exampleTopBotOuterMargin}%
  132. \addtolength{\exampleTopBotOuterMargin}{\parskip}%
  133. \pagebreak[2]%
  134. \Needspace*{5\baselineskip}% 5 could seem a bit too much, but 4 has failed to solve the page breaking problem on a few occasions.
  135. \noindent
  136. \rlap{%
  137. \hspace*{-\exampleLineWidth}\hspace*{-.5em}%
  138. \rule[\exampleLineWidth]{\exampleLineWidth}{1ex}%
  139. \rule[1ex]{2em}{\exampleLineWidth}%
  140. \raisebox{.6ex}{\box\@tempboxa}%
  141. \rule[1ex]{\@tempskipa}{\exampleLineWidth}%
  142. \rule[\exampleLineWidth]{\exampleLineWidth}{1ex}}%
  143. \settoheight{\rt@examplerulepos}{X}%
  144. \addtolength{\rt@examplerulepos}{-\baselineskip}%
  145. \addtolength{\rt@examplerulepos}{-1ex}%
  146. \addtolength{\rt@examplerulepos}{\exampleTopBotInnerMargin}%
  147. \nopagebreak[4]\\[\rt@examplerulepos]%
  148. \begingroup\@afterindentfalse\nopagebreak[4]\ignorespaces%
  149. }
  150. \newcommand*\@endexample{% End of example environments
  151. \unskip% This one matters, but only in rare occasions!
  152. \endgroup
  153. \ifvmode
  154. \nopagebreak[4]\vspace{-\baselineskip}\vspace{-\parskip}%
  155. \fi
  156. \ifhmode
  157. \\[-\baselineskip]%
  158. \fi
  159. \noindent
  160. \setlength{\rt@examplerulepos}{-\exampleTopBotInnerMargin}%
  161. \addtolength{\rt@examplerulepos}{-\exampleLineWidth}%
  162. \nopagebreak[4]%
  163. \begin{picture}(0,0)
  164. \put(0,0){\rlap{%
  165. \hspace*{-\exampleLineWidth}\hspace*{-.5em}%
  166. \rule[\rt@examplerulepos]{\exampleLineWidth}{1ex}%
  167. \addtolength{\linewidth}{1em}% Make a rule that is \linewidth+1em long by temporarily changing \linewidth.
  168. \rule[\rt@examplerulepos]{\linewidth}{\exampleLineWidth}%
  169. \addtolength{\linewidth}{-1em}%
  170. \rule[\rt@examplerulepos]{\exampleLineWidth}{1ex}%
  171. }}
  172. \end{picture}%
  173. \vspace{-\rt@examplerulepos}%
  174. \vspace{-\parskip}\par\addvspace{\exampleTopBotOuterMargin}
  175. \pagebreak[2]%
  176. \ignorespacesafterend%
  177. }