Bekanntlich ist \newcommand
mit einem obligatorischen Argument, gefolgt von zwei optionalen Argumenten, gefolgt von einem weiteren obligatorischen Argument definiert:
\newcommand{
Befehl}[
Argumentanzahl][
Default-Wert]{
Definition}
-
Befehl ist der der Befehl, der definiert werden soll, im Beispiel aus der Frage also \Kalenderblatt
.
-
Argumentanzahl ist eine natürliche Zahl zwischen 1 und 9 und gibt die Anzahl aller Argumente an, die der Befehl verstehen soll. Im Beispiel aus der Frage ist das 2
. Es wird also ein Befehl mit zwei Argumenten definiert. Wird \newcommand
ohne optionales Argument verwendet, so hat der definierte Befehl selbst kein Argument.
-
Default-Wert ist die Voreinstellung für ein optionales Argument für den neuen Befehl. Das optionale Argument wird bei Argumentanzahl mit gezählt. Es ist bei \newcommand
immer das erste Argument, das dann statt in geschweifte in eckige Klammern zu setzen ist (wie die optionalen Argumente von \newcommand
auch). Um einen Befehl mit einem optionalen Argument zu definieren, muss also Argumentanzahl min. 1 sein und es muss zumindest ein leerer Default-Wert angegeben werden. Beim Aufruf des neuen Befehls wird Default-Wert immer dann verwendet, wenn der neue Befehl ohne optionales Argument aufgerufen wird. Wird der neue Befehl dagegen mit einem leeren optionalen Argument aufgerufen, so ist optionale Argument dann auch tatsächlich leer. In diesem Fall wird also nicht der Default-Wert verwendet. In der Frage ist \Kalenderblatt
ohne optionales Argument definiert.
-
Definition ist die Definition von Befehl. Innerhalb der Definition dienen #1
, #2
, #3
… #9
als Platzhalter für das erste, das zweite, das dritte … das neunte Argument. Ist das erste Argument optional, so steht #1
entweder für das angegebene optionale Argument oder für Default-Wert, falls kein optionales Argument angegeben wurde. Für Experten (im Beispiel irrelevant): Falls Definitionen in Definitionen geschachtelt sind, muss die Anzahl der #
für jede Schachtelungsebene (von außen nach innen) verdoppelt werden, um die Argumente von äußeren Definitionen von denen innerer Definitionen unterscheiden zu können.
Es gibt von \newcommand
auch eine Sternform \newcommand*
, die in der Frage auch verwendet wurde. Zu den Unterschieden siehe: Was ist der Unterschied zwischen \newcommand
und \newcommand*
?
Um nun also einen Befehl mit einem optionalen Argument zu definieren, sei zunächst noch einmal darauf hingewiesen, dass dieses optionale Argument dann das erste Argument sein muss, innerhalb der Definition also durch #1
repräsentiert wird. Ich würde auch nicht empfehlen, direkt den Skalierungsfaktor als optionales Argument zu verwenden. Es ist flexibler das optionale Argument einfach als optionales Argument für \includegraphics
zu deklarieren. Das sähe dann in einem auf sinnvolles verkürzten Beispiel so aus:
Öffne in Overleaf\documentclass[fontsize=20pt,ngerman]{scrartcl}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{graphicx}
\newcommand*{\Kalenderblatt}[3][]{% drei Argumente, erstes optional mit leerem Default
\cleardoublepage
\begin{minipage}[c][.5\textheight]{\textwidth}
\centering
\includegraphics[#1]{#2}
\end{minipage}
\vfill
Hier stünde dann der Kalender für #3.
\clearpage
}
\begin{document}
\centering
\Kalenderblatt[scale=1.2]{example-image-a}{2018-05-01 to 2018-05-last}
\Kalenderblatt[scale=0.7]{example-image-b}{2018-06-01 to 2018-06-last}
\Kalenderblatt{example-image-c}{2018-06-01 to 2018-06-last}
\end{document}
Alles weitere zur Verwendung von \newcommand
sollte jeder ausführlichen LaTeX-Einführung zu entnehmen sein. Ich empfehle jedem, der den Umgang mit \newcommand
mit Argumenten noch nicht kennt, sich einmal etwas intensiver mit einer solchen Einführung zu beschäftigen. Meist sind diese eine wahre Fundgrube an Aha-Effekten. Grundlegende Informationen bietet sogar der usrguide
. Dieser ist allerdings nicht wirklich für LaTeX-Anfänger, sondern eher für Umsteiger von LaTeX 2.09 geschrieben, geht also beispielsweise davon aus, dass man die generelle Bedeutung von #1
etc. bereits kennt.
Will man einen Befehl definieren, bei dem das optionale Argument nicht das erste ist oder das mehr als ein optionales Argument hat, so sei auf »Ist es möglich eigene Befehle mit mehr als einem optionalen Argument zu definieren?« verwiesen. Spätestens nach dem Verstehen obiger Erklärung zu \newcommand
sollte auch jene Frage und die Antwort(en) grundsätzlich zu verstehen sein. Dort findet man auch die Erklärung zur Definition von Befehlen mit Argument mit Hilfe von \NewDocumentCommand
wie sie in der ursprünglichen Frage ebenfalls verwendet wurden. Die dort ebenfalls verwendeten Definitionen mit expl3
-Syntax sind davon jedoch unabhängig und abweichend. Dort gibt man letztlich die Argumentanzahl wie bei \def
durch Anreihung von #1
#2
etc. an. Erfahrene LaTeX-Anwender seien diesbezüglich auf die Doku zum LaTeX3-Kern verwiesen.
beantwortet
13 Feb '18, 13:08
gast3
(ausgesetzt)
Akzeptiert-Rate:
53%
Kannst Du Dir bitte ein kürzeres Beispiel überlegen, bei dem man sich nicht durch Tonnen von Code wühlen muss? Der komplette Kalender-Teil ist doch für die Frage eher überflüssig, oder? Ansonsten:
\newcommand*{\foo}[3]
bietet gegenüber\newcommand*{\foo}[2]
ein Argument mehr. Die Platzhalter für die Argumente werden in der Definition von vorn nach hinten nummeriert:#1
,#2
,#3
… Steht auch in jeder ausführlichen LaTex-Einführung. Siehe außerdem das Themanewcommand
. Mit den Beispielen in den Antworten darf man ruhig einmal spielen.Wie gesagt: Ich kapiere den Code nicht. Und ich weiß auch nicht was genau zu Kalender gehört und was nicht. Ich würde es wirklich gerne besser machen, wenn ich es könnte. Ich kann es aber nicht. Es tut mir wirklich sehr leid. Ich kann es einfach nicht. D.h. es würde dann folgendermaßen aussehen?
\includegraphics[scale=#3]{#2}
und unten dann bspw.\Kalenderblatt{2018-05-01 to 2018-05-last}[2]{example-image-a}
? Produziert Fehler.Teilweise immer noch sinnfrei. Aber deutlich verkürzt.