使用 \setlist*[enumerateoptional]{nosep} 后,\enit@c 定义中的参数编号非法

使用 \setlist*[enumerateoptional]{nosep} 后,\enit@c 定义中的参数编号非法

关于这个问题接受答案我怎样才能阻止这个无用的空行出现在我的列表中间?,它定义了一个新的enumitem列表环境叫做enumitemoptional

我一直在使用它到目前为止并没有出现任何问题,除了当我\setlist*[enumerateoptional]{nosep}在最初定义列表后尝试调用时:

test2.tex:24: Illegal parameter number in definition of \enit@c
TeX STOPPED: fatal errors occurred. Check the TeX log file for details

我打电话setlist*并不是setlist因为setlist删除了列表的所有先前设置而setlist*在添加新设置时保留它们。

我想调用,setlist*因为我正在编写文档类,并且enumerateoptional在我的文档类中定义了。然后,稍后用户可以调用setlist*以添加自定义行为nosep

这是一个最小的例子,我在定义列表后调用它\setlist*[enumerateoptional]{nosep},然后抛出Illegal parameter number in definition of \enit@c

\documentclass[10pt]{article}
\usepackage[shortlabels]{enumitem}
\usepackage{etoolbox}

\makeatletter
\let\user@item\@item
\patchcmd\user@item{\if@noitemarg}{\iftrue}{}{\FAILED}
\enitkv@key{}{formatarg}{\def\enit@format##1{#1}}
% Compatibility with older enumitem.sty:
\@ifundefined{enitkv@enumitem@formatarg}
  {\enitkv@key{enumitem}{formatarg}{\def\enit@format##1{#1}}}{}
\newlist{enumerateoptional}{enumerate}{1}
\setlist[enumerateoptional]{%
    before=\let\@item\user@item,
    formatarg=\textbf{########1~\@itemlabel},
    align=left,
    leftmargin=*,
}
\makeatother

\usepackage[colorlinks]{hyperref}
\setlist*[enumerateoptional]{nosep}

\begin{document}
\begin{enumerateoptional}[1.]
  \item[test\_duplicatedContext] Detecção de contextos duplicados e
    emissão de um erro semântico.
  \item[test\_duplicatedIncludes] Detecção de inclusões duplicadas  e
    emissão de um erro semântico.
  \item[test\_invalidRegexInput] Detecção de expressões regulares
    inválidas e emissão de um erro semântico.
  \item[test\_missingIncludeDetection]\label{this} Detecção da inclusão um bloco
    inexistente.
  \item[test\_duplicatedGlobalNames] Detecção de múltiplas definições
    do nome da gramática e
    emissão de um erro semântico.
  \item[test\_missingScopeGlobalName] Detecção da falta da definição do
    nome do escopo global da gramática e emissão de um erro semântico. Ver item~\ref{this}.
\end{enumerateoptional}
\end{document}

答案1

我认为 formatarg 键是不必要的。使用标准格式键可以实现相同的效果:

\documentclass[10pt]{article}
\usepackage[shortlabels]{enumitem}
\usepackage{etoolbox}

\makeatletter
\let\user@item\@item
\patchcmd\user@item{\if@noitemarg}{\iftrue}{}{\FAILED}
\newcommand\mylabelformat[1]{\textbf{#1}~\@itemlabel}
\newlist{enumerateoptional}{enumerate}{1}
\setlist[enumerateoptional]{%
    before=\let\@item\user@item,
    format=\mylabelformat,
    align=left,
    leftmargin=*,
}
\makeatother

\usepackage[colorlinks]{hyperref}
\setlist*[enumerateoptional]{nosep}

\begin{document}\tracingmacros=1
\begin{enumerateoptional}[1.]
  \item[test\_duplicatedContext] Detecção de contextos duplicados e
    emissão de um erro semântico.
  \item[test\_duplicatedIncludes] Detecção de inclusões duplicadas  e
    emissão de um erro semântico.
  \item[test\_invalidRegexInput] Detecção de expressões regulares
    inválidas e emissão de um erro semântico.
  \item[test\_missingIncludeDetection]\label{this} Detecção da inclusão um bloco
    inexistente.
  \item[test\_duplicatedGlobalNames] Detecção de múltiplas definições
    do nome da gramática e
    emissão de um erro semântico.
  \item[test\_missingScopeGlobalName] Detecção da falta da definição do
    nome do escopo global da gramática e emissão de um erro semântico. Ver item~\ref{this}.
\end{enumerateoptional}
\end{document}

在此处输入图片描述

答案2

我设法解决了这个问题,将问题的答案恢复为他的第一次尝试,它使用before而不是formatarg

\documentclass[12pt,a4paper]{article}
\usepackage[shortlabels]{enumitem}
\makeatletter
\def\renewenumerateoptionalitem{%
  \let\itemenumerateoptional\@item%
  \renewcommand{\@item}[1][]{%
      \itemenumerateoptional
        [\bfseries##1~%
         \refstepcounter{enumerateoptionali}% Advance the counter
         \theenumerateoptionali]% Print it
  }%
}

\newlist{enumerateoptional}{enumerate}{1}
\setlist[enumerateoptional]{
    before=\renewenumerateoptionalitem,
    label=\arabic*,
    align=left,
    leftmargin=*,
}
\makeatother

\usepackage{hyperref}
\setlist*[enumerateoptional]{nosep}

\begin{document}
\begin{enumerateoptional}[1.]
    \item[test\_duplicatedContext] Detecção de contextos duplicados e
    emissão de um erro semântico.
    \item[test\_duplicatedIncludes] Detecção de inclusões duplicadas  e
    emissão de um erro semântico.
    \item[test\_invalidRegexInput] Detecção de expressões regulares
    inválidas e emissão de um erro semântico.
    \item[test\_missingIncludeDetection] Detecção da inclusão um bloco
    inexistente.
    \item[test\_duplicatedGlobalNames] Detecção de múltiplas definições
    do nome da gramática e
    emissão de um erro semântico.
    \item[test\_missingScopeGlobalName] Detecção da falta da definição do
    nome do escopo global da gramática e emissão de um erro semântico.
\end{enumerateoptional}
\end{document}

相关内容