![具有类选项键的多个值的 pgfkeys 与某些软件包不兼容](https://linux22.com/image/338611/%E5%85%B7%E6%9C%89%E7%B1%BB%E9%80%89%E9%A1%B9%E9%94%AE%E7%9A%84%E5%A4%9A%E4%B8%AA%E5%80%BC%E7%9A%84%20pgfkeys%20%E4%B8%8E%E6%9F%90%E4%BA%9B%E8%BD%AF%E4%BB%B6%E5%8C%85%E4%B8%8D%E5%85%BC%E5%AE%B9.png)
就像在聊天 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}
pgfkeys
babel
当我尝试取消注释fontspec
、xeCJK
、csquotes
、tcolorbox
、和 时,caption
也出现同样的问题。tabu
metalogo
非常感谢您的帮助。我使用了 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}