我必須根據應該用於描述程式碼功能的描述來建立清單環境。
這是原型:
% !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|}]
這將解決手頭上的問題,儘管逐字部分仍然令人擔憂。