Não consigo criar comando com \DeclareDocumentCommand{}{omv}{}

Não consigo criar comando com \DeclareDocumentCommand{}{omv}{}

Eu tenho que criar um ambiente de lista baseado na descrição que deve ser usada para descrever funções de código.

Aqui está o protótipo:

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

Ele produz o

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

em vez de

insira a descrição da imagem aqui

Se eu remover O{}das \funcitemopções, tudo funcionará conforme o esperado.

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

O que está acontecendo? Como fazer \funcitem[]{}||funcionar com O{}argumento opcional?

( texdoca pesquisa xparsenão ajudou. Eles apenas dizem que a vchave pode ser instável, mintedos documentos dizem que seus ambientes foram cuidadosamente elaborados para funcionar em quase todas as circunstâncias)

ATUALIZAÇÃO 1

Tenho brincado com a \funcitemrealização e descobri quando uso a próxima implementação:

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

produz o mesmo erro. Portanto, o problema não está no O{}ou o, está no argumento opcional de \mintinline. Além disso, quando removo \itemde \funciteme uso fora do fundDescriptionambiente, não recebo nenhum erro. O que está acontecendo?

Responder1

Conforme observado nos comentários, não há suporte para colocar qualquer comando literal no argumento de outro comando e, na melhor das hipóteses, funcionará 'acidentalmente'. Dito isto, a questão específica aqui tem uma causa diferente, não relacionada literalmente.

A captura de argumento opcional 'clássico' no LaTeX faznãocorresponde aos níveis, \item[\mintinline[#1]{#2}|#3|]resultando na \itemleitura \mintinline[#1como argumento opcional. O \mintinlinecomando então tenta ler um argumento opcional, mas não consegue encontrar o final ]e você obtém um erro de baixo nível. Se tivesse \itemsido definido usando ltcmd(que faz correspondência), isso não aconteceria.

A solução para aninhar argumentos opcionais é usar colchetes para ocultar o 'interno':

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

Isso resolverá o problema em questão, embora a parte literal continue a ser uma preocupação.

informação relacionada