Um das Warum zu verstehen, muss man eigentlich verstehen, was TeX (nicht LaTeX) für Argumente kennt und wie diese in LaTeX eingesetzt sind. TeX kennt grundsätzlich zwei Arten von Argumenten:
unbegrenzte Argumente -- das sind die „normalen“ Argumente die in LaTeX mit { und } umschlossen sind.
begrenzte Argumente -- das sind alle anderen Argumente. Was „begrenzt“ hier bedeutet, wird noch genauer erklärt.
Alle Makros, egal ob sie nun mit LaTeXs \newcommand definiert wurden oder nicht, werden schlussendlich eigentlich mit \def definiert. Die Syntax für unbegrenzte Argumente sieht folgendermaßen aus:
Das definiert das Makro \foo mit zwei unbegrenzten Argumenten. Diese Argumente sind die nächsten zwei Token (= Charaktere oder Kontrollsequenzen) oder balancierten Gruppen, die dem Makro folgen:
LaTeXs Syntax ist es, solche Argumente grundsätzlich mit geschweiften Klammern { und } zu umschließen. Dabei müssen die Klammern balanciert sein, was heißt, dass es zu jeder öffnenden Klammer auch eine schließende geben muss, und zwar auf gleicher Ebene. (Eigentlich müssen es nicht { und } sein sondern Charaktere mit catcodes 1 (Beginn einer Gruppe) und 2 (Ende einer Gruppe sein, unabhängig von ihrem Aussehen, aber das nur nebenbei).
Das definiert \foo dergestalt, dass es nach Aufruf eine öffnende eckige Klammer erwartet. Kommt sie nicht als nächstes, gibt es einen Fehler. Wird sie gefunden, dann wird sie weggeworfen, und alles was nun folgt bis zur nächsten schließenden eckigen Klammer auf der selben Gruppierungsebene wird als Argument betrachtet. Wird die schließende eckige Klammer nicht gefunden, Wird sie gefunden, wird sie weggeworfen und alles, was dazwischen lag ist nun das Argument. Dabei wird eine eventuelle äußere Schicht von { und } entfernt:
Code, hier editierbar zum Übersetzen:
1
2
3
4
5
6
\foo[bla] => #1=bla
\foo [bla] => #1=bla
\foo[bla{]}bla] => #1=bla{]}bla
\foo[{bla}] => #1=bla
\foo[{{bla}}] => #1={bla}
\foo x[] => Fehler, die öffnende Klammer [ wird nicht als erstes gefunden
Die Begrenzer müssten eckige Klammern sein, irgendwelche anderen Token (auch mehrere) gehen auch (abgesehen von ein paar Symbolen mit speziellen Kategoriecodes wie %, { und }).
Das Paket xparse (oder genauer: seine Befehle \NewDocumentCommand, ...) definiert seine optionalen Argumente anders: solange die Klammern balanciert sind, muss man sie nicht mit extra geschweiften Klammern umschließen. Hier führen öffnende eckige Klammern nun zu einem Fehler, wenn die entsprechende schließende Klammer fehlt.
"unbegrenzte" Argumente müssen nicht unbedingt geklammert werden: \textbf A oder \newcommand\foo. Es gibt dann auch noch sowas: \def\foo#1\a#|\b#|...\c#2{...}, weshalb ich an deiner Stelle nicht so weit ausgeholt hätte, denn LaTeX kennt das alles nicht.
@Herbert das habe ich beides erwähnt. Vielleicht war es etwas Overkill, für die Frage so weit auszuholen, wenn man aber den wirklichen Grund wissen will, muss man schon TeXs begrenzte Argumente kennen.
@Herbert Ah, habe ich überlesen... stimmt, das hab ich tatsächlich absichtlich weggelassen, weil es für das Verständis, warum LaTeXs optionale Argumente anders funktionieren als die obligatorischen, nicht nötig ist.
Zur Ermittlung des Arguments wird einfach nach der schließenden Klammer ] gesucht und die erstbeste genommen. Du musst daher die Klammerung vorsehen, wenn das Argument selbst eine schließende Klammer enthält. Man könnte xparse nehmen, aber das macht Probleme wenn man eine zusätzliche öffnende Klammer [ verwendet.