前言参数化 - 将参数传递给'\usepackage'

前言参数化 - 将参数传递给'\usepackage'

我有两种语言的简历,它们的序言大部分是相同的,但是\usepackage[<language>]{babel}

我想对序言进行类似如下的参数化:

\usepackage[\cvLanguage]{babel}
\usepackage{doi}

并在主\LaTeX文件中使用它,如:

\newcommand{\cvLanguage}{english}
\input{preamble.tex}

但神秘地失败了:

! Undefined control sequence.
\reserved@b ...onefilewithoptions #1[{\cvLanguage 
                                                  }][{}]\noexpand \@pkgexten...
l.36 \usepackage
                {doi}

因此我提出了这个问题。失败是无法复制的,也就是说我的方法有效,但这个问题已经得到了两个很好的答案,因此我把它留给后代。

答案1

不要将前言放在.tex文件中,而是创建自己的包并使用 LaTeX 的选项机制将您的语言转发到babel。下面使用 LaTeX 内核的内置机制添加 key=value 选项。

\begin{filecontents*}{mypreamble.sty}
\ProvidesPackage{mypreamble}
\DeclareKeys{language .store = \cvLanguage, language .usage = load}
\SetKeys{language=english}% initial value
\ProcessKeyOptions
\RequirePackage[\cvLanguage]{babel}
\RequirePackage{doi}
\end{filecontents*}

\documentclass{article}

\usepackage[language=english]{mypreamble}

\begin{document}
Some document using \cvLanguage.
\end{document}

无耻的广告:

替代实现使用expkv-optexpkv-def而不是 LaTeX 内核的 key=value 实现(我是expkv的作者):

\begin{filecontents*}{mypreamble.sty}
\ProvidesPackage{mypreamble}
\RequirePackage{expkv-opt,expkv-def}
\ekvdefinekeys{mypreamble}
  { store language = \cvLanguage, initial language = english }
\ekvoProcessLocalOptions{mypreamble} % ignore options handed to \documentclass
\RequirePackage[\cvLanguage]{babel}
\RequirePackage{doi}
\end{filecontents*}

\documentclass{article}

\usepackage[language=english]{mypreamble}

\begin{document}
Some document using \cvLanguage.
\end{document}

两个代码块都产生:

在此处输入图片描述

答案2

使用\def而不是\newcommand

\begin{filecontents*}{preamble.tex}
    \usepackage[\cvLanguage]{babel}
    \usepackage[\ForVisualEffect]{geometry} % not needed, just for demo reasons
\end{filecontents*}

\documentclass{article}
\def\cvLanguage{english}
\def\ForVisualEffect{showframe} % not needed, just for demo reasons
\input{preamble.tex}

\begin{document}
    Test
\end{document}

在这里,我还添加了一个类似的例子,其中geometry包可以showframe选择通过视觉证明其有效。

结果

相关内容