How to set class options that can have multiple values?

The standard LaTeX \documentclass syntax doesn't use = at all, just a comma separated list of values like [12pt,twoside] so

\documentclass[toc=listof, toc=bibliography, toc=flat]{article}

would just be three (undefined) options toc=listof , toc=bibliography and toc=flat There is no mechanism for passing values to an option toc.

Some classes load keyval or similar packages and redefine \documentclass to use that so then your example passes the three values listof, bibliography and flat to the toc key defined by that class.

In your example toc={listof, bibliography, flat} the keyval parser will pass the single value listof, bibliography, flat to the toc key, but then it is up to the definition of that key in the class whether it treats this as an unknown value or whether it further processes it as a comma separated list.


The easiest way I found for solving OP's problem is to introduce a new class file xscrbook. See below.

\ProvidesClass{xscrbook}[2013/01/17 v0.1 Extends KOMA-script-book class (AM)]
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\protected\def\scr@preprocessclassoptionslist#1{%
  \ifx#1\relax
    \let#1\@empty
  \fi
  \ifx#1\@empty\else
    \begingroup
    \def\scr@tempa{}%
    \def\scr@tempb##1=##2=##3\scr@nil##4{%
      \ifx\relax##2\relax\else
        \def\scr@option{##1}%
        \edef\scr@value{\zap@space##2 \@empty}%
        ##4%
      \fi
    }%
    \@for\reserved@a:=#1\do{%
      \expandafter\scr@tempb\reserved@a==\scr@nil{%
        \@for\reserved@a:=\scr@value\do{%
          \edef\scr@tempa{%
            \scr@tempa\ifx\scr@tempa\@empty\else,\fi
            \scr@option=\reserved@a
          }%
        }%
      }%
    }%
    \edef\scr@tempa{\endgroup\def\noexpand#1{\scr@tempa}}%
    \scr@tempa
  \fi
}
\scr@preprocessclassoptionslist\@classoptionslist
\ifdefined\XKV@classoptionslist
  \scr@preprocessclassoptionslist\XKV@classoptionslist
\fi
\LoadClass{scrbook}

\endinput

Example

\documentclass[toc={listof, bibliography, flat}]{xscrbook}

\begin{document}
x
\end{document}

The correct way to proceed is described in the KOMA-Script documentation as

Some options can have several values simultaneously. For such options, it is possible, with the help of \KOMAoption, to pass a list of values to a single option. The individual values are given as a comma-separated value list.

So, in your example:

\documentclass[any_option]{scrbook}
\KOMAoption{toc}{bibliography,listof,flat}

Please pay attention that, with biblatex, this was not enough to get the bibliography in the table of contents. I had to use:

\printbibliography[heading=bibintoc]

or any equivalent command.

Enjoy!