Sie sind hier

Klassenoptionen mit mehreren Werten

Hallo Markus,

ich nutze schon seit geraumer Zeit scrbase.sty für das Definieren eigener Optionen und wollte fragen, ob es evtl. möglich ist, diese Paket dahingehend zu erweitern, dass bei der Wertzuweisung für einen Schlüssel im optionalen Argument von \documentclass bereits mehrere Werte gleichzeitig angegeben werden können. Beispielweise so etwas wie:

\documentclass[layout={cd,coloured}]{myscrreprt}

Mir wäre schon geholfen, wenn die Werteliste durchgereicht würde, das Abarbeiten würde ich auch selber hinbekommen. Wenn dies direkt erfolgen würde, wäre ich auch nicht böse. Ich habe bereits diesen Lösungsansatz gefunden, wollte mich aber mal erkundigen, ob du da prinzipiell Handlungsbedarf siehst.

Grüße
Falk

forum: 
Bild von Markus Kohm

Das ganze geht bereits schief, bevor scrbase etwas zu sehen bekommt:

\begin{filecontents}{myscrreprt.cls}
\ProcessOptions\relax
\LoadClass{article}
\end{filecontents}
%\documentclass[layout={cd}]{myscrreprt}% geht auch schon nicht
\documentclass[layout={cd,coloured}]{myscrreprt}
\begin{document}
\end{document}

{ und } dürfen innerhalb einer Option in \documentclass schlicht nicht vorkommen. Selbst, wenn es eine Möglichkeit gäbe, das für \FamilyProcessOptions irgendwie zurecht zu biegen, gäbe es ja auch noch Pakete und Klassen, die nicht \FamilyProcessOptions verwenden. Spätestens bei denen ginge das dann schief. Deshalb halte ich es für besser, an dieser generellen Einschränkung des LaTeX-Kerns gar nicht erst herumzubasteln.

Was eventuell zum Laufen zu bekommen wäre ist:

\RequirePackage{filecontents}
\begin{filecontents}{myscrreprt.cls}
\RequirePackage{scrbase}
% Das folgende bitte nicht nachmachen, weil es ggf. zukünftige Versionen
% von KOMA-Script beschädgit!!!!
\renewcommand*\scr@ifprocess@curroption[2]{%
  \def\reserved@a##1=##2\@nil{\def\reserved@a{##1}}%
  \expandafter\reserved@a\CurrentOption=\@nil
  \scr@ifundefinedorrelax{KV@#2@\reserved@a}{%
    \scr@ifundefinedorrelax{KV@#2#1@\reserved@a}{%
      \let\FamilyKeyState\OptionNotUsed
    }{%
      \protected@edef\reserved@b{\noexpand\setkeys{#2#1}{{\CurrentOption}}% PATCH
        \noexpand\def\noexpand\CurrentOption{\CurrentOption}}%
      \reserved@b
      \ifx\FamilyKeyState\FamilyKeyStateUnknown
        \PackageInfo{scrbase}{Unknown processing state.\MessageBreak
          Processing option `\CurrentOption'\MessageBreak
          of member `#1' of family\MessageBreak
          `#2' doesn't set\MessageBreak
          a valid state. This will be interpreted\MessageBreak
          as \string\FamilyKeyStateProcessed
        }%
        \FamilyKeyStateProcessed
      \fi
    }{%
      \let\FamilyKeyState\OptionNotUsed
    }%
  }{%
    \proteced@edef\reserved@b{\noexpand\setkeys{#2}{{\CurrentOption}}% PATCH
      \noexpand\def\noexpand\CurrentOption{\CurrentOption}}%
    \reserved@b
    \ifx\FamilyKeyState\FamilyKeyStateUnknown
      \PackageInfo{scrbase}{Unknown processing state.\MessageBreak
        Processing option `\CurrentOption'\MessageBreak
        of family `#2'\MessageBreak
        doesn't set a valid state.\MessageBreak
        This will be interpreted\MessageBreak
        as \string\FamilyKeyStateProcessed
      }%
      \FamilyKeyStateProcessed
    \fi
    \def\reserved@a##1=##2\@nil{\def\reserved@a{##1}}%
    \expandafter\reserved@a\CurrentOption=\@nil
    \scr@ifundefinedorrelax{KV@#2#1@\reserved@a}{}{%
      \protected@edef\reserved@b{\noexpand\setkeys{#2#1}{{\CurrentOption}}% PATCH
        \noexpand\def\noexpand\CurrentOption{\CurrentOption}}%
      \ifx\FamilyKeyState\FamiliyKeyStateProcessed
        \reserved@b
        \FamilyKeyStateProcessed
      \else
        \reserved@b
        \ifx\FamilyKeyState\FamilyKeyStateUnknown
          \PackageInfo{scrbase}{Unknown processing state.\MessageBreak
            Processing option `\CurrentOption'\MessageBreak
            of member `#1' of family\MessageBreak
            `#2' doesn't set\MessageBreak
            a valid state. This will be interpreted\MessageBreak
            as \string\FamilyKeyStateProcessed
          }%
          \FamilyKeyStateProcessed
        \fi
      \fi
    }%
  }%
  \ifx\FamilyKeyState\FamilyKeyStateProcessed
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\DefineFamily{my}
\DefineFamilyMember{my}
\DefineFamilyKey{my}{layout}{%
  \typeout{my=`\detokenize{#1}'}%
  \FamilyKeyStateProcessed
}
\FamilyProcessOptions{my}
\LoadClass{minimal}
\end{filecontents}
\documentclass[{layout=cd,coloured},]{myscrreprt}
\begin{document}
\end{document}

Wie kritisch das einzuschätzen ist, siehst Du aber bereits, wenn Du das Komma in der Optionenliste weg lässt. Ich halte es daher für besser, so etwas generell mit zwei vollständigen Optionen, also

\documentclass[layout=cd,layout=coloured]{myscrreprt}

zu realisieren oder per \KOMAoptions statt \documentclass.

Hallo Markus,

vielen Dank für die ausführliche Antwort. Ein einfaches: "Das geht nicht ohne Probleme aufgrund des LaTeX-Kernels." hätte mir auch gereicht. Trotzdem vielen Dank dafür. Mir ging es tatsächlich einfach nur um die Übersichtlichkeit, aber mit den Möglichkeiten von \FamilyOption ist das ja auch relativ einfach machbar.

Grüße
Falk

\begin{filecontents}{myscrreprt.cls}
\RequirePackage{scrbase}
\DefineFamily{TUD}
\DefineFamilyMember{TUD}
\gdef\mylayout{aus}
\gdef\mycolor{aus}
\DefineFamilyKey{TUD}{layout}{%
  \FamilySetNumerical{TUD}{layout}{@tempa}{%
    {false}{0},{off}{0},{no}{0},%
    {true}{1},{on}{1},{yes}{1},{cd}{1},%
    {color}{2},{colour}{2},{colored}{2},{coloured}{2}%
  }{#1}
  \ifcase \@tempa\relax
    \gdef\mylayout{aus}
    \gdef\mycolor{aus}
  \or
    \gdef\mylayout{an}
  \else
    \gdef\mycolor{an}
  \fi
}
\FamilyProcessOptions{TUD}
\LoadClass{scrreprt}
\end{filecontents}
 
\documentclass{myscrreprt}
\FamilyOption{TUD}{layout}{cd,color}
\begin{document}
Layout: \mylayout
 
Farbe: \mycolor
\end{document}
Comments for "Klassenoptionen mit mehreren Werten" abonnieren