我無法使用 \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{}or o,而在於 的可選參數\mintinline。另外,當我\item從 中刪除\funcitem並在環境之外使用它時fundDescription,我沒有收到任何錯誤。怎麼了?

答案1

正如評論中所指出的,不支援將任何逐字記錄的命令放入另一個命令的參數中,並且最多只能「意外」地工作。也就是說,這裡的具體問題有不同的原因,與逐字無關。

LaTeX 中的「經典」可選參數抓取確實如此不是匹配級別,因此\item[\mintinline[#1]{#2}|#3|]導致\item閱讀\mintinline[#1,因為它是可選參數。然後,該\mintinline命令嘗試讀取可選參數,但無法找到末尾],因此您會收到低階錯誤。如果\item使用定義ltcmd(確實進行比對),則不會發生這種情況。

嵌套可選參數的解決方案是使用大括號隱藏“內部”參數:

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

這將解決手頭上的問題,儘管逐字部分仍然令人擔憂。

相關內容