Was sollen die Kommentar-Zeichen (%) am Ende von Zeilen?

In vielen Code-Beispielen und Paketen sieht man das Kommentar-Zeichen % am Ende von Zeilen. Wieso? Welchen Zweck hat das?

Kurz und knapp: so verhindert man, dass ein Zeilenende wie ein Leerzeichen wirkt und ungewollt Zwischenraum eingefügt wird. Häufig in Makro-Definitionen sinnvoll.

Wenn TeX das Ende einer Zeile sieht, wandelt es das in ein Leerzeichen um, exakt äquivalent, als wenn man ein Leerzeichen eingegeben hätte:

Text
Text

ist genau gleich wie

Text Text

Genaugenommen wird das Zeichen eingefügt, das der Nummer des Registers \endlinechar entspricht (solange der Wert zwischen einschließlich 0 und 255 liegt). In der Voreinstellung ist das 13 und entspricht der Eingabe der Enter-Taste (carriage return, ^^M in TeX-Schreibweise mit Kategorie-Code 5=Enter-Taste). Folgt dem Ende einer Zeile ein weiteres Ende einer Zeile, wird stattdessen \par eingefügt.

In Makro-Definitionen gilt das genauso wie im laufenden Text. Die Definition

\newcommand*\foo{
foo
bar
}

ist gleich der Definition

\newcommand*\foo{ foo bar }

wie folgendes Beispiel demonstriert:

\documentclass{article}
\newcommand*\foo{
  foo
  bar
}
\begin{document}
bla\foo{}bar
\end{document}

Da Leerzeichen am Anfang einer Zeile verschluckt werden, nicht aber an anderen Stellen, sollte man Leerzeichen, die durch das Ende von Zeilen verursacht werden, verstecken, damit sie nicht unbeabsichtigt an Stellen auftauchen, an denen man sie nicht möchte:

\newcommand*\foo{%
  foo
  bar%
}

Diese Definition ist jetzt gleichwertig zu

\newcommand*\foo{foo bar}

wie dieses Beispiel demonstriert:

\documentclass{article}
\newcommand*\foo{%
  foo
  bar%
}
\begin{document}
bla\foo{}bar
\end{document}

Jetzt sollte man aber auch nicht den Schluss ziehen, dass man einfach immer an das Ende einer Zeile ein % setzen sollte. Aufpassen muss man zum Beispiel nach Zuweisungen oder Primitiven, die Zahlen nach sich erwarten, wie \ifnum oder \count\foo=.... Diese schauen nämlich so lange weiter nach Zahlen, bis sie entweder ein nichtexpandierbares Token finden, das keine Zahl ist, oder bis sie auf ein Leerzeichen finden, das sie dann entfernen. Mit folgender Definition

\newcommand*\test[1]{%
  \ifnum1=#1%
    1%
  \else
    keine 1%
  \fi
}

liefert

 
  \test{1}

vielleicht unerwarteterweise »keine 1«! Das liegt daran, dass die Definition gleichbedeutend ist mit

\newcommand*\test[1]{\ifnum1=#11\else keine 1\fi}

und tatsächlich 1 mit 11 verglichen wurde. Übrigens: nach Anweisung wie im Beispiel \else und \fi muss man kein Leerzeichen verstecken, da TeX Leerzeichen nach Anweisungen ignoriert. Eine bessere Definition des obigen wäre z.B.:

\newcommand*\test[1]{%
  \ifnum1=#1 % Leerzeichen nach `#1'
    1%
  \else
    keine 1%
  \fi
}

Ähnlich vorsichtig sollte man nach Zuweisungen sein, die Skips (Längen, die dehn- und stauchbare Anteile enthalten können) zuweisen und nach plus und minus suchen.

Von Clemens auf TeXwelt.de: Was sollen die Kommentar-Zeichen (%) am Ende der Zeilen?.