Eu tenho que criar um ambiente de lista baseado na descrição que deve ser usada para descrever funções de código.
Aqui está o protótipo:
% !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}
Ele produz o
document.tex|32 error| Argument of \\RobustMintInline has an extra }.
document.tex|| Runaway argument?
document.tex|32 error| Paragraph ended before \\RobustMintInline was complete.
em vez de
Se eu remover O{}
das \funcitem
opções, tudo funcionará conforme o esperado.
% !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}
O que está acontecendo? Como fazer \funcitem[]{}||
funcionar com O{}
argumento opcional?
( texdoc
a pesquisa xparse
não ajudou. Eles apenas dizem que a v
chave pode ser instável, minted
os documentos dizem que seus ambientes foram cuidadosamente elaborados para funcionar em quase todas as circunstâncias)
ATUALIZAÇÃO 1
Tenho brincado com a \funcitem
realização e descobri quando uso a próxima implementação:
\NewDocumentCommand{\funcitem}{mv}{\item[{\mintinline[tabsize=4]{#1}|#2|}]}
produz o mesmo erro. Portanto, o problema não está no O{}
ou o
, está no argumento opcional de \mintinline
. Além disso, quando removo \item
de \funcitem
e uso fora do fundDescription
ambiente, não recebo nenhum erro. O que está acontecendo?
Responder1
Conforme observado nos comentários, não há suporte para colocar qualquer comando literal no argumento de outro comando e, na melhor das hipóteses, funcionará 'acidentalmente'. Dito isto, a questão específica aqui tem uma causa diferente, não relacionada literalmente.
A captura de argumento opcional 'clássico' no LaTeX faznãocorresponde aos níveis, \item[\mintinline[#1]{#2}|#3|]
resultando na \item
leitura \mintinline[#1
como argumento opcional. O \mintinline
comando então tenta ler um argumento opcional, mas não consegue encontrar o final ]
e você obtém um erro de baixo nível. Se tivesse \item
sido definido usando ltcmd
(que faz correspondência), isso não aconteceria.
A solução para aninhar argumentos opcionais é usar colchetes para ocultar o 'interno':
\item[{\mintinline[#1]{#2}|#3|}]
Isso resolverá o problema em questão, embora a parte literal continue a ser uma preocupação.