Wie kann ich für \Kalenderblatt (aus dieser Antwort) einen zusätzlichen Parameter setzen, so dass ich scale in \includegraphics individuell (d.h. pro Kalenderblatt) anpassen kann? Hier ein verkürztes Beispiel:

Öffne in Overleaf
\documentclass[fontsize=20pt,ngerman]{scrartcl}
\usepackage{babel}
\usepackage{translator}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{graphicx}

\newcommand*{\Kalenderblatt}[2]{%
\cleardoublepage
\begin{minipage}[c][.5\textheight]{\textwidth}
  \centering
  \includegraphics{#2}
\end{minipage}
\vfill
\clearpage}
\begin{document}
\centering
\Kalenderblatt{2018-05-01 to 2018-05-last}{example-image-a}
\Kalenderblatt{2018-06-01 to 2018-06-last}{example-image-b}
\end{document}

gefragt 13 Feb '18, 12:10

runix's gravatar image

runix
1.0k247486
Akzeptiert-Rate: 0%

bearbeitet 13 Feb '18, 13:17

gast3's gravatar image

gast3
(ausgesetzt)

1

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 Thema newcommand. Mit den Beispielen in den Antworten darf man ruhig einmal spielen.

(13 Feb '18, 12:24) saputello

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.

(13 Feb '18, 12:27) runix

Teilweise immer noch sinnfrei. Aber deutlich verkürzt.

(13 Feb '18, 12:46) runix

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.

Permanenter link

beantwortet 13 Feb '18, 13:08

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 13 Feb '18, 13:32

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×76
×20
×13

gestellte Frage: 13 Feb '18, 12:10

Frage wurde gesehen: 6,066 Mal

zuletzt geändert: 13 Feb '18, 13:32