1

I get the error

! Argument of \@item has an extra }.
<inserted text> 
                \par 
l.135 \emph{class} \bfcode{C}}

when translating a LaTeX file generated by Sphinx documentation system.

I've managed to reduce it to the following self-contained example:

\documentclass{article}

\usepackage{hyperref}

\newcommand{\pysigline}[1]{\item[#1]\nopagebreak}

\newenvironment{fulllineitems}{
  \begin{list}{}{\labelwidth \leftmargin \labelsep 0pt
                 \rightmargin 0pt \topsep -\parskip \partopsep \parskip
                 \itemsep -\parsep}
}{\end{list}}

\begin{document}

\begin{fulllineitems}
\pysigline{\phantomsection\label{index:project0class_c}\item[] template \textless{}typename T\textgreater{}
\emph{class} \bfcode{C}}
Test class. 
\end{fulllineitems}

\end{document}

As you can see the '{' and '}' are balanced.

What does this error mean and how can I fix it?

  • 2
    Can you post some sort of minimal, compile-able example? For instance, there's no way for us to know (right now) that the \item is indeed inside some sort of list environment (where it would cause an error outside of one). – Sean Allred Sep 15 '14 at 15:32
  • 3
    impossible to be sure without working example but I wpould gues that \pysigline puts its argument in an optional argument so use \pysigline{{...}} to hide the [] – David Carlisle Sep 15 '14 at 15:34
  • You should work a little and try to reduce the code to the minimal necessary to reproduce your error. Then post it here. – Manuel Sep 15 '14 at 15:44
  • @SeanAllred OK, now I've reduced it to a self-contained example. – vitaut Sep 15 '14 at 16:00
  • 1
    @SeanAllred answer added I was constrained yesterday:-) chat.stackexchange.com/transcript/message/17694997#17694997 – David Carlisle Sep 16 '14 at 11:08
4

A LaTeX optional argument ends at the first ] (unless it is inside a {} group. It does not match [ ] (unless you use the declarations provided by xparse) so in

... \item[...\foo[] ...]  zzz

the argument of \item is not ...\foo[] ... but ...\foo[ and things go wrong.

\pysigline puts its argument in an optional argument so use

\pysigline{{...}}

to hide the []

Or better (if you have access to the definition in your real case) fix the definition to add the extra {} in all cases:

\newcommand{\pysigline}[1]{\item[{#1}]\nopagebreak}
                                 %  %

now a stray ] in the argument to \pysigline is protected from terminating the optional argument of the inner \item

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.