Hilfe mit xparse \newcommand

Hilfe mit xparse \newcommand

Ich habe einige Bilder, die ich zerschneiden muss, und einige, die ich verkleinern muss. Ich habe eine einzelne Lösung mit zwei davon implementiert, \newcommanddie funktioniert hat, aber ich suche nach einer kompakten Lösung mit xparse, die nicht funktioniert hat, und ich kann nicht verstehen, warum.

Ich freue mich über jede Hilfe zur Korrektur und Verbesserung meines unten stehenden Codes.

\documentclass[11pt]{article}

\usepackage{easyfig}

% [cut up]{file}{caption}{label}{scale} - Cut up % <== Ok
\newcommand{\ruleone}[5][.05]{%
    \Figure[trim={.0\width} {.0\height} {.0\width} {#1\height},clip,%
        width=#5\linewidth,keepaspectratio=true,%
        caption={#3},label={#4},center,here]{#2}
}

% [cut down]{file}{caption}{label}{scale} - Cut down % <== Ok
\newcommand{\ruletwo}[5][.05]{%
    \Figure[trim={.0\width} {#1\height} {.0\width} {.0\height},clip,%
        width=#5\linewidth,keepaspectratio=true,%
        caption={#3},label={#4},center,here]{#2}
}

% [cut up]{file}[cut down]{caption}{label}[scale] - Cut down % <== compile with errors
\newcommand{\onerule}[ o m o m m o ]{%
    \Figure[trim={.0\width} {ifNoValueTF{#1}{.0}{#1}\height}%
        {.0\width} {ifNoValueTF{#3}{.0}{#3}\height},clip,%
        width={ifNoValueTF{#6}{1}{#6}\linewidth},keepaspectratio=true,%
        caption={#4},label={#5},center,here]{#2}
}

\begin{document}

Here comes the images:

\ruleone[.45]{example-image-a}{First image}{label1}{.5} % <== this works

\ruletwo[.35]{example-image-a}{Second image}{label2}{.5} % <== This too

\onerule[.35]{example-image-b}{Third image}{label3}{.5}

\onerule{example-image-b}[0.45]{Third image}{label3}{.5}

\end{document}

Antwort1

In xparselautet der Befehl zum Definieren neuer Befehle \NewDocumentCommandanstelle von \newcommand. Auch das zweite Argument, das die Parameter beschreibt, ist obligatorisch ( {...}anstelle von [...]) und ifNoValueTFsollte lauten \IfNoValueTF(in Großbuchstaben und mit einem Backslash).

Darüber hinaus unterdrückt Ihr Argument %am Ende der Zeile mit Trim-Argumenten ein erforderliches Leerzeichen und das Scale-Argument ist optional ( [...]anstelle von {...}).

Dann bekommst du

\documentclass[11pt]{article}

\usepackage{xparse,easyfig}

% [cut up]{file}{caption}{label}{scale} - Cut up % <== Ok
\newcommand{\ruleone}[5][.05]{%
    \Figure[trim={.0\width} {.0\height} {.0\width} {#1\height},clip,%
        width=#5\linewidth,keepaspectratio=true,%
        caption={#3},label={#4},center,here]{#2}
}

% [cut down]{file}{caption}{label}{scale} - Cut down % <== Ok
\newcommand{\ruletwo}[5][.05]{%
    \Figure[trim={.0\width} {#1\height} {.0\width} {.0\height},clip,%
        width=#5\linewidth,keepaspectratio=true,%
        caption={#3},label={#4},center,here]{#2}
}

% [cut up]{file}[cut down]{caption}{label}[scale] - Cut down % <== compile with errors
\NewDocumentCommand \onerule { o m o m m o }{%
    \Figure[trim={.0\width} {\IfNoValueTF{#1}{.0}{#1}\height}
        {.0\width} {\IfNoValueTF{#3}{.0}{#3}\height},clip,%
        width={\IfNoValueTF{#6}{1}{#6}\linewidth},keepaspectratio=true,%
        caption={#4},label={#5},center,here]{#2}
}

\begin{document}

Here comes the images:

\ruleone[.45]{example-image-a}{First image}{label1}{.5} % <== this works

\ruletwo[.35]{example-image-a}{Second image}{label2}{.5} % <== This too

\onerule[.35]{example-image-b}{Third image}{label3}[.5]

\onerule{example-image-b}[0.45]{Third image}{label3}[.5]

\end{document}

verwandte Informationen