Optionale Argumente in „Familien“ … Wann und wie?

Optionale Argumente in „Familien“ … Wann und wie?

Edit: Über die Prämie Ich bin mit der Frage unten zufrieden und diese Prämie ist für diese Frage. Ich glaube nicht, dass ich eine bessere

Ich habe ein wenig über die Verwendung optionaler Argumente in LaTeX recherchiert, aber einige Dinge sind mir noch nicht ganz klar.

Wann

Meine Frage bezieht sich nicht speziell auf Befehle oder Pakete, sondern auf beides.

Manchmal müssen wir ein oder mehrere optionale Argumente für ein Paket oder einen Befehl angeben. Wir können Befehle wie diese finden:

\Foo[OptArg1,OptArg2]{Arg1}{Arg2}

und wie:

\Foo[OptArg1][OptArg2]{Arg1}{Arg2}

Beim ersten sehe ich eine Familie mit zwei optionalen Argumenten, die durch Kommas getrennt sind. Beim zweiten habe ich zwei Familien mit jeweils einem optionalen Argument.

Ich nehme an, dass zwischen diesen beiden Möglichkeiten etwas unterschiedlich ist, habe aber nicht genau verstanden, wann mein Befehl die erste und wann die zweite Möglichkeit verwenden muss.

Nehmen wir zum Beispiel an, wir brauchen einen Befehl, der unser erstes optionales Argument verwendet, um das erste nicht optionale Argument in Teile aufzuteilen. Dann bevorzuge ich die zweite Möglichkeit, da bei der ersten mein Komma als Trennzeichen nicht verstanden wird (es ist bereits ein Trennzeichen). Aber ich könnte trotzdem einen Befehl wie diesen verwenden:

\Foo[separator={,},OptArg2]{Arg1}{Arg2}

um dasselbe zu tun.

Wenn ich die optionalen Argumente der zweiten Familie trennen möchte, wäre meine Methode mit \Foo[separator={//}][OptArg2//OptArg3] natürlich die einzige (oder zumindest bessere) Wahl, da ich den Trenner definieren muss, bevor ich die Argumente der zweiten Familie lese.

Wie

Außerdem muss sich der Befehl manchmal anders verhalten, wenn zwei Familien angegeben sind, und anders, wenn nur eine angegeben ist. Wenn beispielsweise in meinem obigen Beispiel das erste Argument nicht angegeben ist, werden die optionalen Argumente der zweiten Familie durch Kommas getrennt. Wenn jedoch eins angegeben ist, wird es als Trennzeichen verwendet und der Befehl verhält sich beim Lesen der Argumente anders.

In solchen Situationen halte ich \def für eine allgemeinere Option zum Schreiben des Befehls als newcommand, da wir beim Lesen der Argumente mehr Auswahlmöglichkeiten haben. (\newcommand unterbricht das zweite Argument, bevor das erste gelesen wird, oder so etwas in der Art. Erwägen Sie auch ein ']', das in Argumenten der zweiten Familie enthalten ist...)

Meine Fragen sind:

  1. Wann (Standard-LaTeX) muss ich die erste Methode verwenden und wann die zweite?
  2. Ist \def die einzige oder die bessere Möglichkeit, unsere Befehle in allgemeinen Situationen zu definieren, beispielsweise in Situationen, in denen wir die Anzahl der Argumente noch nicht kennen, oder in Situationen wie oben mit dem Trennzeichen oder dem „]“, das ich bereits beschrieben habe?

PS: Bedenken Sie bei der zweiten Frage, dass mein Befehl es mir ermöglichen soll, durch Lesen des nächsten Zeichens viele Situationen zu bewältigen. (Zum Beispiel möchte ich die Zeichen nach dem Befehl einzeln lesen und nur anhalten, wenn ich zwei normale Argumente oder den Befehl \stop usw. gefunden habe. Ich frage nicht nach dem Code dafür, sondern nur, ob \newcommand das kann – und es eine gute Wahl ist – oder ob \def die einzige Wahl ist.)

Antwort1

Ihre Frage vermischt zwei verschiedene Dinge. LaTex2e hat optionale Argumente in []und obligatorische Argumente in {}so

\Foo[OptArg1,OptArg2]{Arg1}{Arg2}

hat ein optionales Argument und zwei obligatorische Argumente.

\Foo[OptArg1][OptArg2]{Arg1}{Arg2}

hat zwei optionale und zwei obligatorische Argumente.

Das zweite Problem ist die durch Kommas getrennte Liste. Dies ist möglicherweise überhaupt kein Teil der Syntax, sondern nur das Komma wird als Zeichen behandelt. So zum Beispiel nach

 \newcommand\Foo[3][]{(#1)-(#2)(#3)}

dann #1wäre OptArg1,OptArg2, #2wäre Arg1und #3wäre Arg2und das Ergebnis wäre zu setzen

(OptArg1,OptArg2)-(Arg1)-(Arg2)

wobei für die Kommas keine besondere Bedeutung zukommt.

Natürlich kann ein Befehl mit den Argumenten machen, was er will, und dazu kann auch das Iterieren über die Kommas gehören. Dafür gibt es im Latex-Format Möglichkeiten ( \@for), oder mehrere Pakete bieten Makros zum Parsen von durch Kommas getrennten Listen. Dies ist jedoch unabhängig von der optionalen Argumenterkennung. Im (legalen) Syntaxbeispiel

 \usepackage[foo,bar]{array,longtable}[2015/01/01 packages by you, me and someone]

Es gibt zwei optionale Argumente und ein obligatorisches Argument. Das erste optionale Argument und das obligatorische Argument werden später im Rahmen der Verarbeitung von durch \usepackageKommas getrennt. Das zweite optionale Argument wird nicht durch Kommas getrennt, sondern durch ein Leerzeichen, /um das Datum vom Anfang des Arguments zu extrahieren.

Was die Definition betrifft, wenn Sie am Anfang nur ein optionales Argument haben, können Sie Folgendes verwenden: \newcommandWenn Sie zwei oder mehr haben, können Sie auch Folgendes verwenden, \newcommand müssen das Makro aber schrittweise definieren, aber es ist wahrscheinlich einfacher, xparseoder ähnliche Pakete zu verwenden, um eine einfachere Spezifikation zu ermöglichen und automatisch die Definition der benötigten internen Makros zu übernehmen. Es ist jedoch besser, nicht zu viele aufeinanderfolgende optionale Argumente zu haben, als ob Sie Folgendes hätten:

 \Foo[OptArg1][OptArg2]{Arg1}{Arg2}

dann OptArg1ist nicht wirklich optional, wenn Sie angeben müssen OptArg2. Eine Syntax wie

\Foo[opt1=a,opt2=b]{Arg1}

ermöglicht das unabhängige Weglassen jeder Option. Aber auch hier kann eine solche Schlüssel=Wert-Analyse auf jede beliebige Zeichenkette angewendet werden, unabhängig davon, ob es sich um ein obligatorisches oder optionales Argument handelt. Beispielsweise graphicxverwendet das keyvalPaket das „ ,und“ =in seinem optionalen Argument

\includegraphics[width=10pt,height=8pt]{image}

und hyperrefverwendet dieselbe Analyse, um dieselbe Syntax in einem obligatorischen Argument zu analysieren

\hypersetup{colorlinks=false,plainpages=true}

verwandte Informationen