\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|}]}

同じエラーが発生します。したがって、問題は または ではなくO{}oのオプション引数にあります。また、から を\mintinline削除して環境の外部で使用すると、エラーは発生しません。何が起こっているのでしょうか?\item\funcitemfundDescription

答え1

コメントで指摘されているように、verbatim のようなコマンドを別のコマンドの引数に入れることはサポートされておらず、せいぜい「偶然」に動作する程度です。とはいえ、ここでの特定の問題には、verbatim とは関係のない別の原因があります。

LaTeXの「古典的な」オプション引数の取得はないレベルが一致するため、オプションの引数として読み取ら\item[\mintinline[#1]{#2}|#3|]れます。次に、コマンドはオプションの引数を読み取ろうとしますが、末尾が見つからないため、低レベルのエラーが発生します。 (マッチングを行う)を使用して定義されていれば、このようなことは起こりません。\item\mintinline[#1\mintinline]\itemltcmd

オプションの引数をネストする解決策は、中括弧を使用して「内側の」引数を非表示にすることです。

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

そうすれば当面の問題は解決するだろうが、逐語的な部分は懸念事項として残るだろう。

関連情報