In der Frage Wie kann ich den vor alltt eingefügten Abstand beseitigen behauptete ich, dass das definierte \noskip müsse in eine Gruppe, um die Wirkung zu begrenzen. Allerdings scheint der Aufruf der alltt-Umgebung die Wirkung bereits aufzuheben. Warum ist das so und gibt es weitere Umgebungen, welche die gleiche Wirkung haben?

gefragt 02 Jan '14, 13:47

sudo's gravatar image

sudo
2.0k51521
Akzeptiert-Rate: 39%


alltt is eine Liste, und \@item ruft ein \@minipagefalse auf. Die interessante Frage ist, warum es aus der Umgebung entweichen kann. Das liegt an der speziellen Definition von \@minipagefalse in latex.ltx. Der Befehl wirkt explizit global:

\def\@minipagefalse{\global\let\if@minipage\iffalse}
\def\@minipagetrue {\global\let\if@minipage\iftrue}
Permanenter link

beantwortet 02 Jan '14, 16:00

Ulrike%20Fischer's gravatar image

Ulrike Fischer
3.6k23
Akzeptiert-Rate: 52%

Ich dachte, ich hätte das in meiner Antwort geschrieben, aber nein: vergessen :( Das Jahr fängt gut an ;)

(02 Jan '14, 16:11) cgnieder

@Ulrike Dann hätte die Gruppe ja noch nicht einmal die Wirkung gehabt, die ich erwartet hätte. Danke für die Info!

(02 Jan '14, 17:38) sudo

Ich vermute, dass die Ursache ein implizit aufgerufenes \item oder vielmehr \@item ist, das in alltt aufgerufen wird:

\newenvironment{alltt}{%
  \trivlist
  \item\relax

\@item enthält in seiner Definition

  \everypar{%
    \@minipagefalse

und tatsächlich sorgt der nächste Absatzbeginn dafür, dass \if@minipage falsch ist:

\documentclass{article}

\makeatletter
\newcommand*\minipagetest{%
  \if@minipage
    \@latex@warning{in minipage}%
  \else
    \@latex@warning{nicht in minipage}%
  \fi
}
\makeatother

\begin{document}

\makeatletter
\@minipagetrue
\minipagetest % drin
\begin{itemize}
  \minipagetest % drin
  \item \minipagetest % drin
  \par\leavevmode\minipagetest % draußen
\end{itemize}

\@minipagetrue
\minipagetest % drin
\begin{itemize}
  \minipagetest % drin
  \item \minipagetest % drin
\end{itemize}
\minipagetest % draußen

\end{document}

Bleibt noch die Frage, warum die Gruppe überlebt wird. Da ich vergessen hatte, das eher hinzuzufügen, hat @Ulrike den Grund in ihrer Antwort erfreulicherweise beigesteuert.


Das gleiche passiert in minipage selbst (durch den Aufruf von \@setminipage) übrigens auch:

\documentclass{article}

\makeatletter
\newcommand*\minipagetest{%
  \if@minipage
    \@latex@warning{in minipage}%
  \else
    \@latex@warning{nicht in minipage}%
  \fi
}
\makeatother

\begin{document}

\begin{minipage}{.333\linewidth}
  \minipagetest % drin
  \par\leavevmode
  \minipagetest % draußen
\end{minipage}

\end{document}
Permanenter link

beantwortet 02 Jan '14, 15:54

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 02 Jan '14, 20:49

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×23
×16
×2

gestellte Frage: 02 Jan '14, 13:47

Frage wurde gesehen: 9,857 Mal

zuletzt geändert: 02 Jan '14, 20:49