Я не могу создать команду с помощью \DeclareDocumentCommand{}{omv}{}

Я не могу создать команду с помощью \DeclareDocumentCommand{}{omv}{}

Мне нужно составить список окружений на основе описания, которое следует использовать для описания функций кода.

Вот прототип:

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

Он производит

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

вместо

введите описание изображения здесь

Если убрать O{}из \funcitemнастроек, то все работает как надо.

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

Что происходит? Как заставить \funcitem[]{}||работать с O{}необязательным аргументом?

( texdocисследование xparseне помогло. Они только говорят, что vключ может быть нестабильным, mintedдокументы говорят, что его среда была тщательно создана для работы практически при любых обстоятельствах)

ОБНОВЛЕНИЕ 1

Я экспериментировал с реализацией \funcitemи обнаружил, что при использовании следующей реализации:

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

он выдает ту же ошибку. Так что проблема не в int O{}или o, а в необязательном аргументе \mintinline. Также, когда я удаляю \itemиз \funcitemи использую его вне fundDescriptionсреды, я не получаю ошибку. Что происходит?

решение1

Как отмечено в комментариях, помещение любой дословно-подобной команды в аргумент другой команды не поддерживается и в лучшем случае сработает «случайно». Тем не менее, конкретная проблема здесь имеет другую причину, не связанную с дословностью.

«Классический» захват необязательного аргумента в LaTeX делаетнетуровни соответствия, поэтому \item[\mintinline[#1]{#2}|#3|]приводит к \itemчтению \mintinline[#1как к необязательному аргументу. \mintinlineЗатем команда пытается прочитать необязательный аргумент, но не может найти конец ], и поэтому вы получаете ошибку низкого уровня. Если бы \itemбыло определено с использованием ltcmd(который выполняет сопоставление), этого бы не произошло.

Решение проблемы вложенности необязательных аргументов — использование фигурных скобок для скрытия «внутреннего» аргумента:

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

Это решит существующую проблему, хотя дословная часть по-прежнему будет вызывать беспокойство.

Связанный контент