So erstellen Sie die „gefährliche Biegeübung“ in TeXbook mit „amsthm“

So erstellen Sie die „gefährliche Biegeübung“ in TeXbook mit „amsthm“

Ich schreibe gerade ein Dokument und habe eine warningTheoremumgebung, die mit erstellt wurde amsthm. Was mich fasziniert, ist, dass KnuthsDas TeXbookEs ist gelungen, das Symbol für die „gefährliche Kurve“ vor etwas zu setzen, das wie eine exerciseUmgebung aussieht. Das Symbol erstreckt sich über genau zwei Zeilen, und der Fettdruck EXERCISEsowie der folgende Text fließen um dieses Symbol herum, sodass die dritte Zeile beginnt und der linke Rand wieder beginnt.

Meine Frage ist, ob ich dies mit vorzugsweise (modifizierten) amsthmUmgebungen nachbilden kann. Ich weiß, dass es trivlistbei der Implementierung der Umgebungen zu Problemen kommt, aber es ist möglicherweise möglich, das Aussehen von amsthmUmgebungen ohne nachzubilden trivlist. Beachten Sie, dass die gefährliche Biegung noch vor der Kopfzeile kommt (z. B. Seite 5 vonDas TeXbook).

Antwort1

Ganz guter Code in Ihrer Antwort, aber er kann verbessert werden. Insbesondere verwende ich \clubpenaltiesanstelle von \clubpenalty, damit wir

  1. einen Seitenumbruch nach der zweiten Zeile vermeiden;
  2. keine Sorge wegen einer Tracht Prügel \clubpenalty;
  3. \clubpenaltiesmit einem Haken zurückgesetzt .

Ich habe auch die Kopfzeile gesetztnachder Absatz beginnt, sodass wir Leerzeichen verwenden können \labelund uns keine Gedanken darüber machen müssen.

Bei einer einzeiligen Warnung prüfen wir \prevgrafdas Ende des ersten Absatzes und wenn es 1 ist, wird eine leere Zeile ohne möglichen Seitenumbruch generiert.

\documentclass{article}

\usepackage{manfnt} % for \dbend
\usepackage{lipsum} % for testing

\counterwithin{equation}{section}

\newlength{\dangerwidth} % width of \dbend
\settowidth{\dangerwidth}{\dbend}
\addtolength{\dangerwidth}{1em} % add any extra space between \dbend and text

\NewDocumentEnvironment{warning}{o}{%
  % I mostly use equation counter, feel free to use any other one
  % default \topsep before theorem environment
  \par\addvspace{\topsep}
  % no line break after first line and discourage after second line
  \clubpenalties=3 10000 5000 0 
  % after first paragraph, reset \clubpenalties
  \AddToHookNext{para/end}{\clubpenalties=0 }%
  % after first paragraph, count the number of lines, if one add an empty line and no page break
  \AddToHookNext{para/after}{\ifnum\prevgraf=1 \nopagebreak\hbox{}\fi}%
  % specifying indentation of first two lines
  \hangindent=\dangerwidth \hangafter=-2 
  % step the associated counter
  \refstepcounter{equation}%
  % store the start so to allow for \label
  \everypar\expandafter{%
    % remove the indentation box
    {\setbox0=\lastbox}% <----  !!!!!!!
    % zero width \dbend, shifted to left border
    \makebox[0pt]{\hspace*{-\hangindent}\dbend\hfill}%
    % theorem name and number
    \textbf{Warning \theequation}%
    % the attribution, if given
    \IfValueT{#1}{ (#1)}%
    % punctuation and space after
    \textbf{.}\hspace*{5pt plus 1pt minus 1pt}%
    % reset \everypar
    \everypar{}%
  }%
  % ignore spaces at the beginning
  \ignorespaces
}{
  % end the paragraph
  \par
  % default space after the environment
  \addvspace{\topsep}%
}

\begin{document}

\lipsum[66]

\begin{warning}[a note]\label{xyz}
    \lipsum[66]

    \lipsum[66]
\end{warning}

\begin{warning}
    \lipsum[66]
\end{warning}

\lipsum[66]

\begin{warning}
    One single line looks weird.
\end{warning}

Let's see the reference \ref{xyz}

\lipsum[66]

\end{document}

Bildbeschreibung hier eingeben

Antwort2

Nach langem Herumprobieren bin ich nun zu einem zufriedenstellenden Ergebnis gekommen. Ich habe die Basisparameter aus amsthmUmgebungen übernommen und mich von KnuthsDas TeXbookCode.

\documentclass{article}

\usepackage{manfnt} % for \dbend
\usepackage{lipsum} % for testing

\newlength{\dangerwidth} % width of \dbend
\settowidth{\dangerwidth}{\dbend}
\addtolength{\dangerwidth}{1em} % add any extra space between \dbend and text

\newenvironment{warning}[1][]{
    \begingroup % local definition
    \stepcounter{equation} % I mostly use equation counter, feel free to use any other one
    \par\addvspace{\topsep} % default \topsep before theorem environment
    \clubpenalty=10000 % no line break after first line
    \hangindent=\dangerwidth \hangafter=-2 % specifying indentation of first two lines
    \noindent\makebox[0pt]{\hspace*{-\hangindent}\dbend\hfill}% % zero width \dbend, shifted to left boarder
    \textbf{Warning \thesection.\theequation}% % theorem name and number
    \if\relax\detokenize{#1}\relax\else % optional argument, check if empty
        \space(#1)% % if so, type optional argument in parenthesis
    \fi
    \textbf{.}\hspace*{5pt plus 1pt minus 1pt}\ignorespaces % add default rubber after theorem header
}{
    \par\addvspace{\topsep}\endgroup % default \topsep after environment
}

\begin{document}

\lipsum[66]

\begin{warning}[a note]
    \lipsum[66]

    \lipsum[66]
\end{warning}

\begin{warning}
    \lipsum[66]
\end{warning}

\lipsum[66]

\begin{warning}
    One single line looks weird.
\end{warning}

\end{document}

Bildbeschreibung hier eingeben

Ich habe zwei Fragen:

  1. Ab sofort \clubpenalty=10000gilt das für die gesamte Umgebung. Kann ich es irgendwie nur auf den ersten Absatz innerhalb dieser Umgebung anwenden? InDas TeXbookKnuth löste dieses Problem nicht, da er verlangte, dass jeder „gefährliche“ Absatz ein Symbol für eine gefährliche Kehre erhalten sollte.
  2. Wie Sie in sehen könnenWarnung 0.3, eine einzelne Linie sieht nicht sehr schön aus. Gibt es eine Möglichkeit, das zu ändern? Ich würde vorschlagen, dass warningman, wenn nur eine Linie innerhalb ist, \textdbendanstelle von verwenden könnte \dbend, dessen Fuß und nicht dessen Mittelpunkt auf der Grundlinie liegt. Wie erkenne ich das?

Geben Sie uns gerne Feedback zu allem, was in den ursprünglichen amsthmUmgebungen fehlt, oder zu Verbesserungen am obigen Code.

verwandte Informationen