我希望我的代码井井有条。为了将选项传递给包,我开发了自己的宏:
\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}}
{}}}