我无法使用 \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从 中删除\funcitem并在环境之外使用它时fundDescription,我没有收到任何错误。发生了什么?

答案1

正如评论中所述,将任何类似逐字的命令放入另一个命令的参数中均不受支持,并且最多只能“意外”起作用。也就是说,这里的具体问题有不同的原因,与逐字无关。

LaTeX 中的“经典”可选参数抓取不是匹配级别,因此\item[\mintinline[#1]{#2}|#3|]导致\item读取\mintinline[#1可选参数。\mintinline然后,该命令尝试读取可选参数,但无法找到结尾],因此您会得到一个低级错误。如果\item使用 (确实进行匹配)进行定义ltcmd,则不会发生这种情况。

嵌套可选参数的解决方案是使用括号隐藏“内部”参数:

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

这将解决当前的问题,尽管逐字逐句的部分仍然令人担忧。

相关内容