문서 클래스 옵션에 따라 패키지에 조건부 명령(if...then)을 작성하는 방법은 무엇입니까?

문서 클래스 옵션에 따라 패키지에 조건부 명령(if...then)을 작성하는 방법은 무엇입니까?

저는 신입이고 이것이 나의 첫 번째 게시물입니다. 사이트를 검색했는데 내 질문에 대한 답변을 찾을 수 없었습니다. 제가 찾지 못한 중복된 질문이 있으면 알려주시기 바랍니다.

클래스를 사용하는 템플릿이 있는데 memoir가장 많이 사용되는 옵션은 a4paper또는 letterpaper문서를 보내는 사람에 따라 다릅니다.

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}

a4paper또한 in 에 대한 옵션 처리를 트리거합니다 memtufte. 이는 \typeout{}옵션 코드에 호출을 추가하여 쉽게 확인할 수 있습니다 . 예:

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

그런 다음 콘솔과 .log파일에는 다음 줄이 포함됩니다.

memtufte:a4paper

두 번째 질문

일반적으로 전역 옵션(에 지정된 옵션 \documentclass)이 패키지에 전달됩니다. 따라서 패키지는 일반을 통해 이를 읽을 수 있습니다 \DeclareOption.

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

관련 정보