Menu

HowTo_AvoidSpaces

Wie unerwünschte Leerzeichen in der Ausgabe vermieden werden

Um das Problem und die Lösung verständlich zu machen, muss ich ein wenig ausholen und die Hintergründe erklären. Parser und Scanner von TeX sind eng miteinander verknüpft. Gehen wir davon aus, dass alle Zeichen ihre üblichen catcodes haben, dann gilt:

  • Zeilenenden werden wie Leerzeichen behandelt.
  • Mehrere aufeinanderfolgende Leerzeichen werden zu einem zusammengefasst.
  • Mehrere aufeinanderfolgende Leerzeilen werden als Absatzende (\par) aufgefasst.
  • Leerzeichen nach Zahlen, die als Zahlen gelesen werden, werden als Ende der Zahl aufgefasst. Dies betrifft ordentlichen LaTeX-Code weniger, da man in LaTeX mit \setcounter, \addtocounter, \value, \roman, \Roman, \arabic, \Alph und \the<Zählername> arbeitet.
  • Leerzeichen nach einem Makro werden als Ende des Makros interpretiert (Beispiel: »\normalsize \normalfont« wird als »\normalsize« und »\normalfont« interpretiert).
  • Nicht-Buchstaben unmittelbar nach einem Makro beenden ebenfalls das Makro, werden aber interpretiert (Beispiel: »\normalsize9 wird als \normalsize und 9 interpetiert; »\textbf9« wird als \textbf mit Argument 9 und »\textbf98« als \textbf mit Argument 9 und als 8 interpretiert).
  • Außer in Klassen und Paketen und zwischen \makeatletter und \makeatother ist das at-Zeichen (@) ein Nicht-Buchstabe.
  • Argumentklammern sind Nicht-Buchstaben!
  • Leerzeichen zwischen Argumentklammern werden in der Regel ignoriert.
  • Leerzeichen zwischen Paaren von Gruppenklammern werden nicht ignoriert.
  • Leerzeichen nach optionalen Argumenten oder optionalen Sternen an Makros werden in der Regel ignoriert.
  • LaTeX definiert einige Anweisungen so, dass versucht wird, Leerzeichen vor und nach der Anweisung zusammenzufassen (beispielsweise bei \index{foo}). Das funktioniert jedoch nicht immer.
  • LaTeX definiert einige Umgebungen so, dass Leerzeichen danach ignoriert werden. Dies gilt in der Regel für die Umgebungen, die in den vertikalen Modus schalten (also insbesondere nicht für tabular und minipage, die innerhalb des horizontalen Modus vertikales Material setzen).

Das bedeutet beispielsweise, dass bei einem Makro, das wie folgt definiert ist:

\newcommand*{\Beispiel}[1]{
  { \sffamily{ \bfseries
      #1}
  }
}

gleich drei signifikante Leerzeichen vor dem Argument und zwei danach eingefügt werden. Zu besseren Verdeutlichung hier die Definition noch einmal, wobei ich die signifikanten Leerzeichen als und die Zeilenenden, die zu signifikanten Leerzeichen werden, durch markiert habe:

\newcommand*{\Beispiel}[1]{{\sffamily{\bfseries
      #1}}}

Sollen diese Leerzeichen beseitigt werden, so müssen die einen schlicht weglassen und die anderen auskommentiert werden

\newcommand*{\Beispiel}[1]{%
  {\sffamily{\bfseries
      #1}%
  }%
}

Das war es schon fast. Als letztes bleibt zu erwähnen, dass eine Verschiebung eines ganzen Blocks wie beispielsweise einer tabular, \parbox oder einer minipage manchmal einfach nur durch den normalen Absatzeinzug entsteht. Das ist immer dann der Fall, wenn dieser Block am Anfang des Absatzes oder auch ganz alleine im Absatz steht. In diesem Fall hilft es, entweder keinen Absatz zu machen, also beispielsweise vorhandenene Leerzeilen zu entfernen oder notfalls ein \noindent am Anfang des Absatzes einzufügen.


Related

Issues: #52
Wiki (Deutsch): HowTo_Layout

MongoDB Logo MongoDB