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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.