LyX | Reihenfolge der Makroargumente ändern

LyX | Reihenfolge der Makroargumente ändern

Ist es in LyX möglich, die Reihenfolge der erforderlichen und optionalen Argumente eines Makros zu ändern?

Ich möchte, dass das Optionsargument in diesem Makro nach dem erforderlichen Argument steht.

Wenn es möglich ist, wie kann ich es tun?

Screenshot des Makros

Antwort1

Ich empfehle dies nicht, da es für jeden, der Ihr Dokument liest, verwirrend sein wird. Es funktioniert auch nicht bei allen Makros, insbesondere nicht bei denen, die mit Kategoriecodes herumspielen, bevor sie deren Argumente lesen. Trotzdem ist es möglich.

Hier ist ein LaTeX-Code, der ein Makro definiert, \flipdas die erforderlichen und optionalen Argumente eines Makros umkehrt, das so definiert ist, dass es genau ein erforderliches und ein optionales Argument hat.

\usepackage{etoolbox}

\makeatletter
\newcommand*\flip[1]{%
    \cslet{flip@\string#1}#1%
    \long\def#1##1{%
        \@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
    }%
}
\long\def\@flip#1#2[#3]{%
    \csuse{flip@\string#1}[#3]{#2}%
}
\makeatother

Beispielsweise angesichts der Makro

\newcommand\foo[2][none]{%
    \par
    Required argument: #2\\
    Optional argument: #1%
}

\flip\fooSie können es einmal schreiben und es wird neu definiert \foo, um ein erforderliches Argument gefolgt von einem optionalen Argument anzunehmen. Hier ist ein vollständiges Dokument, das dies veranschaulicht.

\documentclass{article}
\usepackage{parskip}
\usepackage{etoolbox}

\makeatletter
\newcommand*\flip[1]{%
    \cslet{flip@\string#1}#1%
    \long\def#1##1{%
        \@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
    }%
}
\long\def\@flip#1#2[#3]{%
    \csuse{flip@\string#1}[#3]{#2}%
}
\makeatother

\newcommand\foo[2][none]{%
    \par
    Required argument: #2\\
    Optional argument: #1%
}


\begin{document}

Normal use:
\foo{blah}
\foo[option]{asdf}

Now we can flip the arguments:
\flip\foo
\foo{blah}
\foo{asdf}[option]
\end{document}

Bildbeschreibung hier eingeben

Ich habe LyX bisher noch nie verwendet, konnte meinen Code jedoch in die Präambel einfügen und denselben Effekt erzielen.

Beachten Sie, dass das Fehlen von in einem Makro \flipnicht berücksichtigt wird (d. h. Makros, die über die Familie ohne oder über definiert sind ). Dies kann in einigen Fällen zu verwirrenden Fehlern führen. Es ist möglich, damit ähnlich umzugehen wie mit Patches für Makros, aber für diese Antwort schien es nicht lohnend, dies zu tun.\long\def\long\newcommand*etoolbox

Es wäre auch möglich, \flipes so zu definieren, dass es sein Argument nicht neu definiert, sondern stattdessen zu \flip\foo{required}[optional]erweitert \foo[optional]{required}. Etwas wie (ungetestet)

\long\def\flip#1#2[#3]{#1[#3]{#2}}

Dadurch wird das optionale Argument zu einem erforderlichen Argument. Wenn Sie jedoch nicht über das optionale Argument verfügen, gibt es keinen Grund, es zu verwenden \flip.

Zusammenfassend lässt sich sagen, dass es möglich ist, Sie sollten es aber wahrscheinlich nicht tun.

verwandte Informationen