Я написал оболочку для scrartcl
класса следующим образом:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycls}[2012/08/23]
\RequirePackage{kvoptions}
\DeclareStringOption{title}
\DeclareStringOption{subtitle}
\ProcessKeyvalOptions*
\PassOptionsToClass{fleqn, openbib, headings=big, DIV=12}{scrartcl}
\LoadClassWithOptions{scrartcl}
Таким образом, я могу предоставить некоторые аргументы по умолчанию для scrartcl
like DIV=12
и по-прежнему переопределять их, передавая
\documentclass{title=mytitle, subtitle=thesubtitle, DIV=10}
Проблема, с которой я столкнулся, заключается в том, что он srcartcl
отмечает другие параметры, например, title=mytitle
как неиспользуемые .
Предупреждение LaTeX: неиспользуемые глобальные параметры
что, безусловно, ложно. Я пробовал отменять настройки с помощью
\DisableKeyvalOptions{mycls}{title}
сразу после \ProcessKeyvalOptions*
, но это не сработало. Как мне отметить эти опции как использованные?
решение1
Я по-новому и внимательно посмотрел на The LaTeX Companion
(A.4.8) и решил проблему самостоятельно.
Несмотря на то, что я предполагал ранее, \PassOptionsToClass
и \LoadClassWithOptions
не работают вместе. Весь смысл в \LoadClassWithOptions
том, чтобы передать точно такие же аргументы, которые получил текущий класс. Так что здесь переключение на \LoadClass
теперь будет принимать параметры по умолчанию.
К сожалению, теперь заданные пользователем глобальные параметры не перезапишут параметры по умолчанию. Поэтому их нужно вручную передавать в класс. Здесь kvoptions
представлен \DeclareDefaultOption
эквивалент классическому \DeclareOption*
. В целом результат выглядит так:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycls}[2012/08/23]
\RequirePackage{kvoptions}
\DeclareStringOption{title}
\DeclareStringOption{subtitle}
\PassOptionsToClass{fleqn, openbib, headings=big, DIV=12}{scrartcl}
\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessKeyvalOptions*
\LoadClass{scrartcl}
Поэтому всякий раз, когда \ProcessKeyvalOptions*
он видит неизвестную опцию, например DIV=10
, он передает ее в scrartcl
, перезаписывая в процессе любое значение по умолчанию. Вот почему \PassOptionsToClass
пришлось переместить его перед ним.