Ich schreibe gerade ein Dokument und habe eine warning
Theoremumgebung, 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 exercise
Umgebung aussieht. Das Symbol erstreckt sich über genau zwei Zeilen, und der Fettdruck EXERCISE
sowie 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) amsthm
Umgebungen nachbilden kann. Ich weiß, dass es trivlist
bei der Implementierung der Umgebungen zu Problemen kommt, aber es ist möglicherweise möglich, das Aussehen von amsthm
Umgebungen 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 \clubpenalties
anstelle von \clubpenalty
, damit wir
- einen Seitenumbruch nach der zweiten Zeile vermeiden;
- keine Sorge wegen einer Tracht Prügel
\clubpenalty
; \clubpenalties
mit einem Haken zurückgesetzt .
Ich habe auch die Kopfzeile gesetztnachder Absatz beginnt, sodass wir Leerzeichen verwenden können \label
und uns keine Gedanken darüber machen müssen.
Bei einer einzeiligen Warnung prüfen wir \prevgraf
das 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}
Antwort2
Nach langem Herumprobieren bin ich nun zu einem zufriedenstellenden Ergebnis gekommen. Ich habe die Basisparameter aus amsthm
Umgebungen ü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}
Ich habe zwei Fragen:
- Ab sofort
\clubpenalty=10000
gilt 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. - 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
warning
man, wenn nur eine Linie innerhalb ist,\textdbend
anstelle 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 amsthm
Umgebungen fehlt, oder zu Verbesserungen am obigen Code.