Pull to refresh

LaTeX: конфликт опций для пакета

Reading time 3 min
Views 6.8K
Original author: Robin Fairbairns

Перевод страницы «Option clash for package» из FAQ UK $\TeX$ Users' Group.


Я просто вставил в документ строчку

\usepackage[draft]{foo}

и теперь $\LaTeX$ ругается

! LaTeX Error: Option clash for package foo.
(Конфликт опций для пакета foo)

Эта ошибка указывает на то, что пакет был более одного раза загружен с указанием опций. $\LaTeX$ недоволен, потому что не может самостоятельно разбираться с опциями. (В преамбуле документа можно загрузить пакет без опций несколько раз — $\LaTeX$ обработает лишь первый запрос на загрузку и проигнорирует последующие; а вот указывать опции можно только при первой загрузке пакета).

Похоже, что не всё так просто, как показалось вначале. Если ошибку вызывает следующий код

\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.

Если интересующий нас пакет загружается внутри другого пакета, то можно попросить $\LaTeX$ пробросить нужные опции. Вместо

\usepackage{foo}
\usepackage[draft]{graphics} 

следует писать

\PassOptionsToPackage{draft}{graphics}
\usepackage{foo} 

Команда \PassOptionsToPackage просит $\LaTeX$ вести себя при окончательной загрузке пакета так, словно её параметры были указаны как опции при окончательной загрузке пакета. Из имени команды \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].



Примечания переводчика



  1. Пример сообщения об ошибке
    Скрытый текст
    %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.
  2. В моей TeXstudio выполняется команда latex -interaction=nonstopmode ..., и подобные выдачи нужно искать в «подвале» в разделе Log - Log File.
  3. На TeX.SX предлагают более элегантное решение: команда \PreventPackageFromLoading пакета scrlfile.
Tags:
Hubs:
+19
Comments 0
Comments Leave a comment

Articles