Как написать условную команду (if...then) в пакете в зависимости от опции класса документа?

Как написать условную команду (if...then) в пакете в зависимости от опции класса документа?

Я новичок и это мой первый пост. Я искал на сайте и не смог найти ответ на свой вопрос. Если есть дубликат вопроса, который я не нашел, пожалуйста, дайте мне знать.

У меня есть шаблон с использованием memoirкласса, и наиболее используемым вариантом является a4paperили letterpaperв зависимости от того, кому я отправляю документ.

У меня есть файл стилей в стиле tufte, определяющий различные поля для a4paperили letterpaper.

\ProvidesPackage{memtufte}
\DeclareOption{a4paper}{%
  \settrims{0pt}{0pt}%
  \settypeblocksize{640pt}{310pt}{*}%
  \setlrmargins{63.754pt}{*}{*}%
  \setmarginnotes{16pt}{144pt}{0.7\baselineskip}%
}
\DeclareOption{letterpaper}{%
  \settrims{0pt}{0pt}%
  \settypeblocksize{600pt}{320pt}{*}%
  \setlrmargins{64.1475pt}{*}{*}%
  \setmarginnotes{16pt}{150pt}{0.5\baselineskip}%
}
\ProcessOptions\relax
... ... (and some other settings that are common for a4paper and letterpaper.

и в main.texфайле я пишу что-то вроде следующего,

\documentclass[letterpaper,11pt,article,twoside]{memoir}
\usepackage[letterpaper]{memtufte}

или

\documentclass[a4paper,11pt,article,twoside]{memoir}
\usepackage[a4paper]{memtufte}

Это работает, но мне придется изменить параметры класса и пакета, чтобы они остались прежними.

  1. Итак, мой первый вопрос: как мне переписать пакет таким образом, чтобы его можно было просто использовать \usepackage{memtufte}в основном файле, а поля были бы установлены правильно в соответствии с опцией класса.

  2. Второй вопрос: можно ли это обобщить на любые варианты классов (A, B, C, ...), например,

    if class option is A, then do something, 
    if class option is B and C, do something else,
    if class option is C, do another thing,
    ...
    

Спасибо.

решение1

\ProcessOptionsтакже считывает глобальные параметры (параметры, заданные в \documentclass). Таким образом,

\documentclass[a4paper]{memoir}
\usepackage{memtufte}

также запускает обработку опций для a4paperin memtufte. Это можно легко проверить, добавив \typeout{}вызовы в код опций, например:

\DeclareOption{a4paper}{%
  ...%
  \typeout{memtufte:a4paper}%
}

Тогда консоль и .logфайл содержат строку

memtufte:a4paper

Второй вопрос

Обычно глобальные опции (опции, указанные в \documentclass) передаются в пакет. Таким образом, пакет может читать их через обычный \DeclareOption:

\DeclareOption{A}{... do something ...}
\ProcessOptions\relax % or \ProcessOptions*

Связанный контент