Ich muss eine Listenumgebung basierend auf der Beschreibung erstellen, die zur Beschreibung der Codefunktionen verwendet werden soll.
Hier ist der Prototyp:
% !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}
Es erzeugt die
document.tex|32 error| Argument of \\RobustMintInline has an extra }.
document.tex|| Runaway argument?
document.tex|32 error| Paragraph ended before \\RobustMintInline was complete.
anstatt
Wenn ich es O{}
aus den \funcitem
Optionen entferne, funktioniert alles wie vorgesehen.
% !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}
Was ist los? Wie funktioniert es \funcitem[]{}||
mit O{}
optionalen Argumenten?
( texdoc
Die Recherche xparse
hat nicht geholfen. Sie sagen nur, dass der v
Schlüssel möglicherweise instabil ist, minted
in den Dokumenten steht, dass seine Umgebungen sorgfältig entwickelt wurden, um unter fast allen Umständen zu funktionieren.)
AKTUALISIERUNG 1
Ich habe mit der \funcitem
Realisierung gespielt und festgestellt, dass bei Verwendung der nächsten Implementierung Folgendes möglich ist:
\NewDocumentCommand{\funcitem}{mv}{\item[{\mintinline[tabsize=4]{#1}|#2|}]}
es erzeugt den gleichen Fehler. Das Problem liegt also nicht im O{}
oder o
, sondern im optionalen Argument von \mintinline
. Auch wenn ich es \item
aus entferne \funcitem
und außerhalb der fundDescription
Umgebung verwende, erhalte ich keinen Fehler. Was ist los?
Antwort1
Wie in den Kommentaren erwähnt, wird das Einfügen eines wörtlichen Befehls in das Argument eines anderen Befehls nicht unterstützt und funktioniert bestenfalls „aus Versehen“. Das spezifische Problem hier hat jedoch eine andere Ursache, die nichts mit wörtlichem Befehl zu tun hat.
Das klassische optionale Argument-Grabbing in LaTeX funktioniertnichtEbenen abgleichen, daher \item[\mintinline[#1]{#2}|#3|]
wird als optionales Argument \item
gelesen . Der Befehl versucht dann, ein optionales Argument zu lesen, findet aber das Ende nicht und Sie erhalten einen Fehler auf niedriger Ebene. Wäre es mit definiert worden (was Übereinstimmungen durchführt), wäre dies nicht passiert.\mintinline[#1
\mintinline
]
\item
ltcmd
Die Lösung zum Verschachteln optionaler Argumente besteht darin, Klammern zu verwenden, um das „innere“ Argument zu verbergen:
\item[{\mintinline[#1]{#2}|#3|}]
Damit ist das vorliegende Problem gelöst, der wörtliche Teil wird jedoch weiterhin Anlass zur Sorge geben.