如何设置可以有多个值的类选项?

如何设置可以有多个值的类选项?

标题说明了一切,但这里有一个例子:KOMA-Script 类提供了toc可以有多个互不干扰的值的选项,例如启用目录中的参考书目的值和仅影响目录布局的其他值。当我需要类选项中的几个值时toc,我如何将它们全部传递给而toc不必一直重复toc=

我目前拥有的:

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

我想得到什么(但没有实现)

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

这有可能吗?如果可以,怎么做?

答案1

标准 LaTeX\documentclass语法根本不使用=,只是使用逗号分隔的值列表,如下[12pt,twoside]所示

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

只会是三个(未定义的)选项toc=listoftoc=bibliography并且toc=flat 没有将值传递给选项的机制toc

一些类加载keyval或类似的包并重新定义\documentclass使用它,这样您的示例就会传递三个值listofbibliography以及该类定义的键flattoc

在您的示例中,toc={listof, bibliography, flat}keyval 解析器会将单个值传递 listof, bibliography, flattoc键,但随后由类中该键的定义决定是否将其视为未知值或是否进一步将其处理为逗号分隔的列表。

答案2

我发现解决 OP 问题的最简单方法是引入一个新的类文件書籍。 见下文。

\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

例子

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

\begin{document}
x
\end{document}

答案3

KOMA-Script 文档中描述了正确的操作方法

某些选项可以同时具有多个值。对于此类选项,可以借助 \KOMAoption 将值列表传递给单个选项。各个值以逗号分隔的值列表形式给出。

因此,在您的示例中:

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

请注意,使用 biblatex 时,这不足以获取目录中的参考书目。我必须使用:

\printbibliography[heading=bibintoc]

或任何等效命令。

享受!

相关内容