Wie erstellt man in LaTeX einen Befehl mit optionalen Argumenten? Etwas wie:
\newcommand{\sec}[2][]{
\section*{#1
\ifsecondargument
and #2
\fi}
}
}
Dann kann ich es so nennen
\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
latex
optional-arguments
Verhogen
quelle
quelle
Antworten:
Beispiel aus der Anleitung :
quelle
Die allgemeine Idee hinter dem Erstellen von "optionalen Argumenten" besteht darin, zuerst einen Zwischenbefehl zu definieren, der im Voraus scannt, um zu erkennen, welche Zeichen als nächstes im Token-Stream auftauchen, und dann die relevanten Makros einfügt, um die anstehenden Argumente entsprechend zu verarbeiten. Dies kann mit der generischen TeX-Programmierung ziemlich mühsam (wenn auch nicht schwierig) sein. LaTeX
\@ifnextchar
ist für solche Dinge sehr nützlich.Die beste Antwort auf Ihre Frage ist die Verwendung des neuen
xparse
Pakets. Es ist Teil der LaTeX3-Programmiersuite und enthält umfangreiche Funktionen zum Definieren von Befehlen mit ganz beliebigen optionalen Argumenten.In Ihrem Beispiel haben Sie ein
\sec
Makro, das entweder ein oder zwei geschweifte Argumente akzeptiert. Dies würdexparse
mit folgendem implementiert werden :Das Argument
{ m g }
definiert die Argumente von\sec
;m
bedeutet "obligatorisches Argument" undg
ist "optionales Klammerargument".\IfNoValue(T)(F)
kann dann verwendet werden, um zu überprüfen, ob das zweite Argument tatsächlich vorhanden war oder nicht. In der Dokumentation finden Sie weitere Arten von optionalen Argumenten, die zulässig sind.quelle
(Hello and ) (Hello and Hi)
All dies zeigt, dass es schwierig sein kann, eine schöne, flexible (oder überlastete) Funktion in LaTeX zu erstellen !!! (Dieser TeX-Code sieht für mich wie Griechisch aus.)
Nun, nur um meine jüngste (wenn auch nicht so flexible) Entwicklung hinzuzufügen, hier ist, was ich kürzlich in meinem Diplomarbeitsdokument verwendet habe, mit
Starten Sie den Befehl, wobei der Befehl "optional" standardmäßig leer ist:
Ich habe dann das Makro eine temporäre Variable \ temp {} gesetzt, je nachdem, ob das optionale Argument leer ist oder nicht. Dies kann auf jedes übergebene Argument ausgedehnt werden.
Dann führe ich das Makro mit der Variablen \ temp {} für die beiden Fälle aus. (Hier wird nur die kurze Beschriftung so eingestellt, dass sie der langen Beschriftung entspricht, wenn sie nicht vom Benutzer angegeben wurde.)
In diesem Fall überprüfe ich nur das einzelne "optionale" Argument, das \ newcommand {} bereitstellt. Wenn Sie es beispielsweise für 3 "optionale" Argumente einrichten würden, müssten Sie immer noch die 3 leeren Argumente senden ... z.
Das ist ziemlich albern, ich weiß, aber das ist ungefähr so weit, wie ich es mit LaTeX machen werde - es ist einfach nicht so sinnlich, wenn ich mir TeX-Code anschaue ... Ich mag die xparse-Methode von Mr. Robertson, vielleicht auch ich werde es versuchen ...
quelle
Sie benötigen lediglich Folgendes:
quelle
x^2+1
oderx^{2+1}
Ich habe also die Frage, ob Ihr Befehl das Vorhandensein von Zahnspangen testet. Ist es möglich, einen LaTeX-Befehl zu erstellen, der Folgendes\sec
erzeugt: "A, b, c und d" für den Befehl\sec{A}[b,c,d]
, "A und b" für\sec{A}[b] and "A" for
\ sec {A} `?\sec{A}[b,c,d]
oder\sec{A}[b]
oder zu erstellen\sec{A}
.Ich hatte ein ähnliches Problem, als ich einen Befehl erstellen wollte, um
\dx
abzukürzen\;\mathrm{d}x
(dh ein zusätzliches Leerzeichen vor das Differential des Integrals zu setzen und das "d" ebenfalls aufrecht zu halten). Aber dann wollte ich es auch flexibel genug machen, um die Integrationsvariable als optionales Argument aufzunehmen. Ich habe den folgenden Code in die Präambel eingefügt.Dann
gibt \ dx mit optionalem Argument an
quelle
Hier ist mein Versuch, er folgt jedoch nicht genau Ihren Spezifikationen. Nicht vollständig getestet, seien Sie also vorsichtig.
quelle