我必须根据应该用来描述代码功能的描述来制作列表环境。
原型如下:
% !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|}]
这将解决当前的问题,尽管逐字逐句的部分仍然令人担忧。