[Перевод] LaTeX: конфликт опций для пакета
Перевод страницы «Option clash for package» из FAQ UK Users' Group.
Я просто вставил в документ строчку
\usepackage[draft]{foo}
и теперь ругается
! LaTeX Error: Option clash for package foo.
(Конфликт опций для пакета foo)
Эта ошибка указывает на то, что пакет был более одного раза загружен с указанием опций. недоволен, потому что не может самостоятельно разбираться с опциями. (В преамбуле документа можно загрузить пакет без опций несколько раз — обработает лишь первый запрос на загрузку и проигнорирует последующие;, а вот указывать опции можно только при первой загрузке пакета).
Похоже, что не всё так просто, как показалось вначале. Если ошибку вызывает следующий код
\usepackage[dvips]{graphics}
\usepackage[draft]{graphics}
то его определённо стоит переписать следующим образом:
\usepackage[dvips,draft]{graphics}
Что же делать, когда причина ошибки не столь очевидна (даже если такие загрузки разнесены на несколько строк, их легко обнаружить невооружённым глазом)? Может оказаться, что интересующий нас пакет уже был загружен где-то в другом месте. Но где именно? Если нажать после сообщения об ошибке клавишу «h» можно увидеть список опций, с которыми вызывались загрузки пакета[1][2]. Если же ответное сообщение выглядит по другому, то придётся воспользоваться советами из статьи How to approach errors. Главное помнить, что процесс загрузки пакета в логе окружён скобками, так что, если пакет graphics
загружается в пакете foo
, то лог будет выглядеть примерно так
(/foo.sty ...
...
(/graphics.sty ...
...)
...
)
Обратите внимание, что скобки, относящиеся к пакету graphics
, заключены в скобки, относящиеся к пакету foo
. В случае класса bar
, сообщение будет точно таким же, только в первой строке будет указан путь к файлу bar.cls
.
Если интересующий нас пакет загружается внутри другого пакета, то можно попросить пробросить нужные опции. Вместо
\usepackage{foo}
\usepackage[draft]{graphics}
следует писать
\PassOptionsToPackage{draft}{graphics}
\usepackage{foo}
Команда \PassOptionsToPackage
просит вести себя при окончательной загрузке пакета так, словно её параметры были указаны как опции при окончательной загрузке пакета. Из имени команды \PassOptionsToPackage
видно, что за раз можно указать сразу несколько опций.
Дело несколько осложняется, если опции нужно передать в пакет, который загружается в классе документа. В этом случае, вместо
\documentclass[...]{bar}
\usepackage[draft]{graphics}
следует вставить команду \PassOptionsToPackage
перед командой \documentclass
:
\PassOptionsToPackage{draft}{graphics}
\documentclass[...]{bar}
Может показаться, что мы попали в тупик, если в пакете foo
или классе bar
пакет graphics
загружается с опцией, конфликтующей с той, которую мы хотели бы указать.
Например
\PassOptionsToPackage{draft}{graphics}
в то время как в пакете или классе написано
\usepackage[final]{graphics}
приведёт к тому, что опция final
будет установлена после переданных извне опций, и draft
будет попросту отброшена. В некоторых случаях пакет может вывести сообщение об ошибке (но graphics
не из таких, и опция draft
будет отброшена без какой-либо диагностики).
В таком случае можно самостоятельно отредактировать пакет/класс (в соответствии с его лицензией). Так же будет оказаться полезным связаться с автором пакета, которая может предложить альтернативные способы решения проблемы[3].
Примечания переводчика
- Пример сообщения об ошибкеСкрытый текст
%clash.tex \documentclass{article} \usepackage[dvips]{graphics} \usepackage[draft]{graphics} \begin{document} \end{document}
$ latex clash.tex
...
! LaTeX Error: Option clash for package graphics.See the LaTeX manual or LaTeX Companion for explanation.
Type H for immediate help.
...l.5
? h
The package graphics has already been loaded with options:
[dvips]
There has now been an attempt to load it with options
[draft]
Adding the global options:
dvips,draft
to your \documentclass declaration may fix this.
Try typing to proceed. - В моей
TeXstudio
выполняется командаlatex -interaction=nonstopmode ...
, и подобные выдачи нужно искать в «подвале» в разделеLog - Log File
. - На TeX.SX предлагают более элегантное решение: команда
\PreventPackageFromLoading
пакетаscrlfile
.