No puedo crear un comando con \DeclareDocumentCommand{}{omv}{}

No puedo crear un comando con \DeclareDocumentCommand{}{omv}{}

Tengo que hacer una lista del entorno basado en la descripción que debería usarse para describir las funciones del código.

Aquí está el prototipo:

% !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}

Produce el

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

en lugar de

ingrese la descripción de la imagen aquí

Si elimino O{}de las \funcitemopciones, todo funciona según lo previsto.

% !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}

¿Lo que está sucediendo? Cómo hacer que \funcitem[]{}||funcione conO{} un argumento opcional?

( texdocLa investigación xparseno ayudó. Solo dicen que vla clave puede ser inestable, mintedlos médicos dicen que sus entornos han sido cuidadosamente diseñados para funcionar en casi todas las circunstancias).

ACTUALIZACIÓN 1

He estado jugando con la \funcitemrealización y descubrí cuando uso la siguiente implementación:

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

produce el mismo error. Entonces el problema no es int O{}or o, está en el argumento opcional de \mintinline. Además, cuando lo elimino \itemy \funcitemlo uso fuera del fundDescriptionentorno, no aparece ningún error. ¿Lo que está sucediendo?

Respuesta1

Como se señaló en los comentarios, no se admite poner cualquier comando textual en el argumento de otro comando y, en el mejor de los casos, funcionará "accidentalmente". Dicho esto, el tema específico aquí tiene una causa diferente, ajena al texto literal.

La captura de argumentos opcional 'clásica' en LaTeX nonocoincide con los niveles, por lo que \item[\mintinline[#1]{#2}|#3|]da como resultado la \itemlectura \mintinline[#1como argumento opcional. Luego, el \mintinlinecomando intenta leer un argumento opcional, pero no logra encontrar el final ]y, por lo tanto, obtiene un error de bajo nivel. Si se hubiera \itemdefinido usando ltcmd(que sí coincide), esto no sucedería.

La solución para anidar argumentos opcionales es usar llaves para ocultar el 'interno':

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

Eso resolverá el problema que nos ocupa, aunque la parte literal seguirá siendo motivo de preocupación.

información relacionada