传递包选项和 \setup 等命令的便捷方式

传递包选项和 \setup 等命令的便捷方式

我希望我的代码井井有条。为了将选项传递给包,我开发了自己的宏:

\makeatletter

\newcommand*\Option{%
  \@ifstar{\@Option}{}}

\newcommand*\@Option[3]{%
  \PassOptionsToPackage{#2}{#1}}

\makeatother

使用的一个示例,在序言中:

\Option*{babel}{frenchb}{french babel language}

#1 是包名
#2 是选项
#3 是简短描述
星号表示我们确实想要使用该选项。
包名是第一个参数,这样我就可以按字母顺序对它们进行排序。

带星号的版本可以工作。但是没有星号的版本,代码:

\Option{babel}{frenchb}{french babel language}

产生错误:

! LaTeX Error: Missing \begin{document}

为了进一步使用 frenchb 包,frenchb 提供了一个命令来全局更改文档的外观:\frenchbsetup{}

我想用同样的方式来实现这一点:

\makeatletter

\newcommand*\Frenchb{%
  \@ifstar{\@Frenchb}{}}

\newcommand*\@Frenchb[2]{%
  \AtBeginDocument{%
    \@ifpackagewith{babel}{frenchb}
     {\frenchbsetup{#1}}
     {}}}

\makeatother

带星号的版本不起作用,而无星号的版本会产生与 \Option 相同的错误。


以下是完整文档:

\documentclass{report}

\makeatletter

\newcommand*\Option{%
  \@ifstar{\@Option}{}}

\newcommand*\@Option[3]{%
  \PassOptionsToPackage{#2}{#1}}

\newcommand*\Frenchb{%
  \@ifstar{\@Frenchb}{}}

\newcommand*\@Frenchb[2]{%
  \AtBeginDocument{%
    \@ifpackagewith{babel}{frenchb}
     {\frenchbsetup{#1}}
     {}}}

\makeatother

\Option{babel}{frenchb}        {french babel language}
\Frenchb{CompactItemize=false} {don't make compact itemize}

\usepackage{babel}
%\frenchbsetup{CompactItemize=false}

\begin{document}

  \part{Introduction} % checking babel/frenchb

    \begin{itemize} % checking CompactItemize=false
      \item item 1
      \item item 2
    \end{itemize}

\end{document}

答案1

在没有的*情况下,您不执行任何操作,将以下参数作为文本留在输入流中,这是以前不允许的\begin{document}(并且您也不想排版文本),因此您必须分别吞噬三个和两个参数:

\makeatletter
\def\eat@Option#1#2#3{}
\newcommand*\Option{%
  \@ifstar{\@Option}{\eat@Option}}

\newcommand*\@Option[3]{%
  \PassOptionsToPackage{#2}{#1}}

\newcommand*\Frenchb{%
  \@ifstar{\@Frenchb}{\@gobbletwo}}

\newcommand*\@Frenchb[2]{%
  \AtBeginDocument{%
    \@ifpackagewith{babel}{frenchb}
     {\frenchbsetup{#1}}
     {}}}

相关内容