Мне нужно составить список окружений на основе описания, которое следует использовать для описания функций кода.
Вот прототип:
% !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|}]}
он выдает ту же ошибку. Так что проблема не в int O{}
или o
, а в необязательном аргументе \mintinline
. Также, когда я удаляю \item
из \funcitem
и использую его вне fundDescription
среды, я не получаю ошибку. Что происходит?
решение1
Как отмечено в комментариях, помещение любой дословно-подобной команды в аргумент другой команды не поддерживается и в лучшем случае сработает «случайно». Тем не менее, конкретная проблема здесь имеет другую причину, не связанную с дословностью.
«Классический» захват необязательного аргумента в LaTeX делаетнетуровни соответствия, поэтому \item[\mintinline[#1]{#2}|#3|]
приводит к \item
чтению \mintinline[#1
как к необязательному аргументу. \mintinline
Затем команда пытается прочитать необязательный аргумент, но не может найти конец ]
, и поэтому вы получаете ошибку низкого уровня. Если бы \item
было определено с использованием ltcmd
(который выполняет сопоставление), этого бы не произошло.
Решение проблемы вложенности необязательных аргументов — использование фигурных скобок для скрытия «внутреннего» аргумента:
\item[{\mintinline[#1]{#2}|#3|}]
Это решит существующую проблему, хотя дословная часть по-прежнему будет вызывать беспокойство.