Wie schreibt man einen bedingten Befehl (wenn...dann) in ein Paket, abhängig von der Dokumentklassenoption?

Wie schreibt man einen bedingten Befehl (wenn...dann) in ein Paket, abhängig von der Dokumentklassenoption?

Ich bin neu und dies ist mein allererster Beitrag. Ich habe die Site durchsucht und konnte keine Antwort auf meine Frage finden. Wenn es eine doppelte Frage gibt, die ich nicht gefunden habe, lassen Sie es mich bitte wissen.

Ich habe eine Vorlage mit memoirKlasse und die am häufigsten verwendete Option ist a4paperoder, letterpaperje nachdem, an wen ich das Dokument sende.

Ich habe eine tufte-ähnliche Stildatei, die unterschiedliche Ränder für a4paperoder definiert 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.

und in main.texdie Datei schreibe ich so etwas wie das Folgende,

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

oder

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

Das funktioniert, aber ich muss sowohl die Klassen- als auch die Paketoptionen ändern, damit sie gleich bleiben.

  1. Meine erste Frage lautet also, wie ich das Paket so umschreiben kann, dass ich es einfach \usepackage{memtufte}in der Hauptdatei verwenden kann und der Rand entsprechend der Klassenoption richtig festgelegt wird.

  2. Die zweite Frage ist, ob dies auf alle Klassenoptionen (A, B, C, ...) verallgemeinert werden kann, z. B.

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

Danke.

Antwort1

\ProcessOptionsliest auch die globalen Optionen (die in gesetzten Optionen \documentclass). Daher

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

löst auch die Optionenbehandlung für a4paperin aus memtufte. Dies lässt sich leicht überprüfen, indem man \typeout{}Aufrufe im Optionscode hinzufügt, z. B.:

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

Dann enthält die Konsole und .logdie Datei die Zeile

memtufte:a4paper

Zweite Frage

Normalerweise werden globale Optionen (in angegebene Optionen \documentclass) an das Paket übergeben. Das Paket kann sie daher über das normale lesen \DeclareOption:

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

verwandte Informationen