具有类选项键的多个值的 pgfkeys 与某些软件包不兼容

具有类选项键的多个值的 pgfkeys 与某些软件包不兼容

就像在聊天 TexAndFriends 中讨论的那样,我目前正在添加在自己的类文件中定义语言的功能。

这是我的最小(非工作)示例。我的类文件包含我正在使用的包。我没有在这里添加自定义,因为这些自定义有几百行甚至几千行。

testtemplate.cls

% !TEX encoding = UTF-8
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
% Date mandatory otherwise error message: 
%! Missing number, treated as zero.
\ProvidesClass{testtemplate}

\LoadClass[twoside]{report}

\RequirePackage{iftex}

\RequirePackage{tikz}
\RequirePackage{pgfkeys}
\RequirePackage{pgfopts}

\pgfkeys{
    /wgetdoc/.cd,
    languages/.code=\typeout{The languages you specified are: #1},
    someOtherKey/.store in=\@wgetdoc@options@someotherkey
}


\ProcessPgfOptions{/wgetdoc}

\@ifundefined{@wgetdoc@options@someotherkey}{
    \typeout{someotherkey found}    
}{
    \typeout{someotherkey value:\@wgetdoc@options@someotherkey}
}

%\RequirePackage[english]{babel}
\RequirePackage{etoolbox}
\RequirePackage{iflang}
\RequirePackage{translations}
%\RequirePackage[no-math]{fontspec}
%\RequirePackage{xeCJK}
%\RequirePackage{csquotes}
\RequirePackage{setspace}
\RequirePackage{parskip}
\RequirePackage{titlesec}
\RequirePackage{enumitem}
%\RequirePackage{tcolorbox}
%\RequirePackage{caption}
\RequirePackage{epigraph}
\RequirePackage{longtable}
%\RequirePackage{tabu}
\RequirePackage{booktabs}
\RequirePackage{graphicx}
\RequirePackage{float}
\RequirePackage[export]{adjustbox}
\RequirePackage{datetime}
\RequirePackage{fancyhdr}
\RequirePackage[backend=biber,sorting=none,alldates=short]{biblatex}
\RequirePackage{hyperref}
\RequirePackage{pdfpages}
\RequirePackage{amssymb}
\RequirePackage{MnSymbol}
\RequirePackage{wasysym}
%\RequirePackage{metalogo}
\RequirePackage{menukeys}

someFile.tex

\documentclass[someOtherKey=hello world,languages={dutch,french}]{testtemplate}

\begin{document}
    Hello world
\end{document}

一旦您添加 babel\RequirePackage行,XeLaTeX 就会拒绝进一步编译并使用以下几行(实际上是一个片段)发出抱怨:

[...]
(/usr/local/texlive/2015/texmf-dist/tex/latex/pgfopts/pgfopts.sty)
The languages you specified are: dutch,french
someotherkey value:helloworld
(/usr/local/texlive/2015/texmf-dist/tex/generic/babel/babel.sty

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.176 \ProcessOptions*

我在 pgfkeys 上读到文档,第 42 节,第 518 页,使用 pgfkeys 的 TIKZ 图形可能会与 babel 发生问题,因为后者正在大量修改 catcodes(尤其是法语,例如,必须在冒号“:”后添加空格)。在这种用例中,文档明确指出,如果仅使用 KITZ 或同时使用 KITZ,则分别使用\usepgflibrary{babel}或。但在我的用例中,在包调用之前或之后指定其中一个命令并不能解决任何问题 :-(\usetikzlibrary{babel}pgfkeysbabel

当我尝试取消注释fontspecxeCJKcsquotestcolorbox、和 时,caption也出现同样的问题。tabumetalogo

非常感谢您的帮助。我使用了 keyval,但后者很烦人,因为我需要重新发明轮子,xkeyval 不允许,key={value1,value2}否则会在编译时崩溃,而 pgfkeys 似乎是这里的完美解决方案,因为它可以帮助我解决问题那个错误

答案1

也许你可以开始上课,这样看起来

% !TEX encoding = UTF-8
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
% Date mandatory otherwise error message: 
%! Missing number, treated as zero.
\ProvidesClass{testtemplate}

\let\oldin@\in@
\def\zzz#1#2#{\oldin@{#2}{#1}\zzzb}
\def\in@#1#2{\zzz{#2}#1{}\@nil}
\def\zzzb#1\@nil{}

\LoadClass[twoside]{report}

(尽管第 3 行的评论并不正确)

这只是从标准选项解析器所见的选项中删除括号组,但您可以使用任何键值解析器自己处理列表。

答案2

带有括号中的值的选项会使解析器感到困惑。也许有更好的方法,但类似

\RequirePackage{etoolbox}

\let\@wgetdoc@languages\@empty

\pgfkeys{
    /wgetdoc/.cd,
    language/.code=\appto\@wgetdoc@languages{#1,},
    mainlanguage/.code=\appto\@wgetdoc@languages{main=#1,},
    someOtherKey/.store in=\@wgetdoc@options@someotherkey,
}

\ProcessPgfOptions{/wgetdoc}

\ifdefempty{\@wgetdoc@languages}{}{%
  \RequirePackage[\@wgetdoc@languages]{babel}%
}

似乎有效;选项应采用以下方式之一:

使用主要语言

这里的主要语言是荷兰语

\documentclass[
  mainlanguage=dutch,
  language=french,
]{testtemplate}

无主要语言

这里的主要语言是法语(最后指定的)

\documentclass[
  language=dutch,
  language=french,
]{testtemplate}

无语言

此处该babel包不会被加载。

\documentclass{testtemplate}

相关内容