Ich kann keinen Befehl mit \DeclareDocumentCommand{}{omv}{} erstellen

Ich kann keinen Befehl mit \DeclareDocumentCommand{}{omv}{} erstellen

Ich muss eine Listenumgebung basierend auf der Beschreibung erstellen, die zur Beschreibung der Codefunktionen verwendet werden soll.

Hier ist der Prototyp:

% !TeX program = lualatex

\documentclass[11pt]{report}
\usepackage{enumitem}
\usepackage{minted}
\usepackage{xparse}

\newlist{funcDescription}{description}{1}
\setlist[funcDescription, 1]{itemsep=2mm, style=nextline, font=\mdseries\ttfamily, align=left}
\NewDocumentCommand{\funcitem}{O{}mv}{\item[\mintinline[#1]{#2}|#3|]}

\begin{document}

    \begin{funcDescription}
        \funcitem{c}{int printf(const char * format, ...)}
            Writes the \code{C} string pointed by format to the standard output
            (stdout). If format includes format specifiers (subsequences
            beginning with \code{\%}), the additional arguments following
            format are formatted and inserted in the resulting string replacing
            their respective specifiers.
    \end{funcDescription}
    
\end{document}

Es erzeugt die

document.tex|32 error| Argument of \\RobustMintInline has an extra }.
document.tex|| Runaway argument?
document.tex|32 error| Paragraph ended before \\RobustMintInline was complete.

anstatt

Bildbeschreibung hier eingeben

Wenn ich es O{}aus den \funcitemOptionen entferne, funktioniert alles wie vorgesehen.

% !TeX program = lualatex

\documentclass[11pt]{report}
\usepackage{enumitem}
\usepackage{minted}
\usepackage{xparse}

\newlist{funcDescription}{description}{1}
\setlist[funcDescription, 1]{itemsep=2mm, style=nextline, font=\mdseries\ttfamily, align=left}
\NewDocumentCommand{\funcitem}{mv}{\item[\mintinline{#1}|#2|]}

\begin{document}

    \begin{funcDescription}
        \funcitem{c}|int printf(const char * format, ...)|
            Writes the \code{C} string pointed by format to the standard output
            (stdout). If format includes format specifiers (subsequences
            beginning with \code{\%}), the additional arguments following
            format are formatted and inserted in the resulting string replacing
            their respective specifiers.
    \end{funcDescription}
    
\end{document}

Was ist los? Wie funktioniert es \funcitem[]{}||mit O{}optionalen Argumenten?

( texdocDie Recherche xparsehat nicht geholfen. Sie sagen nur, dass der vSchlüssel möglicherweise instabil ist, mintedin den Dokumenten steht, dass seine Umgebungen sorgfältig entwickelt wurden, um unter fast allen Umständen zu funktionieren.)

AKTUALISIERUNG 1

Ich habe mit der \funcitemRealisierung gespielt und festgestellt, dass bei Verwendung der nächsten Implementierung Folgendes möglich ist:

\NewDocumentCommand{\funcitem}{mv}{\item[{\mintinline[tabsize=4]{#1}|#2|}]}

es erzeugt den gleichen Fehler. Das Problem liegt also nicht im O{}oder o, sondern im optionalen Argument von \mintinline. Auch wenn ich es \itemaus entferne \funcitemund außerhalb der fundDescriptionUmgebung verwende, erhalte ich keinen Fehler. Was ist los?

Antwort1

Wie in den Kommentaren erwähnt, wird das Einfügen eines wörtlichen Befehls in das Argument eines anderen Befehls nicht unterstützt und funktioniert bestenfalls „aus Versehen“. Das spezifische Problem hier hat jedoch eine andere Ursache, die nichts mit wörtlichem Befehl zu tun hat.

Das klassische optionale Argument-Grabbing in LaTeX funktioniertnichtEbenen abgleichen, daher \item[\mintinline[#1]{#2}|#3|]wird als optionales Argument \itemgelesen . Der Befehl versucht dann, ein optionales Argument zu lesen, findet aber das Ende nicht und Sie erhalten einen Fehler auf niedriger Ebene. Wäre es mit definiert worden (was Übereinstimmungen durchführt), wäre dies nicht passiert.\mintinline[#1\mintinline]\itemltcmd

Die Lösung zum Verschachteln optionaler Argumente besteht darin, Klammern zu verwenden, um das „innere“ Argument zu verbergen:

\item[{\mintinline[#1]{#2}|#3|}]

Damit ist das vorliegende Problem gelöst, der wörtliche Teil wird jedoch weiterhin Anlass zur Sorge geben.

verwandte Informationen