如何为包声明多个选项

如何为包声明多个选项

我正在编写一个包,已经用 添加了两个选项\DeclareOption。然后\ExecuteOptions我用 设置默认选项。这确实很有效,但现在我必须添加第二个选项类型,这似乎不起作用。

让我解释一下选项类型的含义。前几个选项(记住,那些运行良好的选项)定义了一种语言(我使用包进行了自定义翻译translations,此选项将语言传递给翻译包和 babel),因此只传递了其中一个,例如\usepackage[en]{myPackage}。我现在尝试做的是将第二个选项传递给我的包,其中也有两种选择(参考书目是按名称还是按外观排序),因此 usepackage 命令应如下所示:\usepackage[en, bib-by-appearance]{myPackage}

我所做的如下:

\DeclareOption{de}{%
    % Some Code
}

\DeclareOption{en}{%
    % Some Code
}

\DeclareOption{bib-by-name}{%
    \bibliographystyle{abbrvnat}%
}

\DeclareOption{bib-by-appearance}{%
    \bibliographystyle{template-files/custom-abbrvnat}%
}

\ExecuteOptions{en, bib-by-appearance}

\ProcessOptions\relax

这似乎不起作用。我应该如何定义选项来获得结果?


更新

我被要求提交一份 MWE,我通常也会发布一份,但我无法重现这种行为……我通常使用 ShareLaTeX 进行 MWE,因为我发现设置小文档更简单,现在我最终上传了我的整个项目并对其进行了编译。使用 ShareLaTeX 时,它运行良好,但在我的计算机上却不行。我的电脑说

Package natbib: Citation 'FooBar' on page 1 undefined.

而它应该被定义(并且它也确实被定义,就像 ShareLaTeX 示例所示)。我还测试了简单地使用\bibliographystyle{template-files/custom-abbrvnat}而不通过选项选择它。这也很好用。所以看起来如果 bibstyle 是通过选项设置的,我的计算机就很难完成它的工作了。

\ExecuteOptions{en}如果我更改为 ,就会失败\ExecuteOptions{en, bib-by-appearance}。因此,我能够实现\DefineOption这两种可能性,如果直接调用(没有选项),我也能够使用这两种 bibstyles,但是当我将包的默认值设置为 时,我会失败en, bib-by-appearance

更新 2

我现在还测试了如果我直接设置语言而不使用选项会发生什么,因此将\ExecuteOptions仅包含bib-by-appearance并且这有效。所以我想我已经找到问题所在了。现在我的问题是:

为什么这两个选项都不起作用?我该如何让它工作?


随意说出你心中的猜测,我很乐意尝试。如果我可以提供除 MWE 之外的其他内容,请告诉我。

答案1

中的空格\ExecuteOptions是一个容易解决的问题;但还有另一个问题。输入

\documentclass{article}
\usepackage[en,bib-by-name]{sam}

\begin{document}
x
\end{document}

.aux文件将包含

\relax 
\bibstyle{unsrtnat}
\bibstyle{abbrvnat}

运行 BibTeX 将中止加载第二个 bib 样式,这是用户想要的!

This is BibTeX, Version 0.99d (TeX Live 2017)
The top-level auxiliary file: samtest.aux
The style file: unsrtnat.bst
Illegal, another \bibstyle command---line 3 of file samtest.aux
 : \bibstyle
 :          {abbrvnat}
I'm skipping whatever remains of this command

使用条件:

\RequirePackage{natbib}
\DeclareOption{de}{%
    % Some Code
}

\DeclareOption{en}{%
    % Some Code
}

\newif\ifbibbyname
\DeclareOption{bib-by-name}{%
  \bibbynametrue
}

\DeclareOption{bib-by-appearance}{%
  \bibbynamefalse
}

\ExecuteOptions{en,bib-by-appearance}% <--- no spaces here!

\ProcessOptions\relax

\ifbibbyname
  \bibliographystyle{abbrvnat}
\else
  \bibliographystyle{unsrtnat}
\fi

(我使用了标准围兜样式,而不是您定制的样式,只需替换它即可。)

答案2

发现问题

en这令人难以置信,但事实就是如此,问题出在和之间的空格bib-by-appearance。我刚刚试过

\ExecuteOptions{en}
\ExecuteOptions{bib-by-appearance}

这有效,然后我尝试

\ExecuteOptions{en,bib-by-appearance}

这也奏效了。此时此刻我已经觉得自己很笨了。但当我添加一个空格来写

\ExecuteOptions{en, bib-by-appearance}

又失败了。

所以如果有人遇到同样的问题,请尝试删除空格,这样就没问题了......

相关内容