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, 07:47

sudo's gravatar image

sudo
1.9k1817
Akzeptiert: 100%


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, 10:00

Ulrike%20Fischer's gravatar image

Ulrike Fischer
2.2k13

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

(02 Jan '14, 10:11) Clemens

@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, 11: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, 09:54

Clemens's gravatar image

Clemens
19.0k113060

bearbeitet 02 Jan '14, 14:49

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×14
×12
×2

Frage gestellt: 02 Jan '14, 07:47

Frage wurde angeschaut: 2,160 Mal

Zuletzt aktualisiert: 02 Jan '14, 14:49