0

On this question accepted answer How can I stop this useless empty line popping up in the middle of my lists?, it is defined a new enumitem list environment called enumitemoptional.

I have been using it so far and no problems, except, when I tried to call \setlist*[enumerateoptional]{nosep}, after defining the list initially:

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

I am calling setlist* and not setlist because setlist erases all previous settings for the list while setlist* keeps them while adding new ones.

I would like to call setlist* because I am writing a document class and the enumerateoptional is defined inside my document class. Then, later, the users can call setlist* to add custom behaviors as nosep.

This is a minimal example, where I am calling \setlist*[enumerateoptional]{nosep} after defining the list, and it is throwing the 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}

2 Answers 2

1

The formatarg key is imho unneeded. The same can be achieved with the standard format key:

\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}

enter image description here

0

I managed to fix it, by reverting the question answer to his first attempt, which uses before instead of 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}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .