我有两种语言的简历,它们的序言大部分是相同的,但是\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-opt
和expkv-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
选择通过视觉证明其有效。