场景 1

场景 1

场景 1

实际上我可以这样做:

mylistings.sty,我定义

\def\tabsize{3}

\RequirePackage{listings}
\lstset{tabsize=\tabsize}

并在mytable.sty,我定义

\RequirePackage{mylistings}
\RequirePackage{fancyvrb}
\fvset{tabsize=\tabsize}

场景 2

由于某些原因,我不喜欢上面的场景 1。

相反,我想做如下事情(当然现在不起作用)

mylistings.sty,我定义

\RequirePackage{listings}
\lstset{tabsize=3}%example

并在mytable.sty,我定义

\RequirePackage{mylistings}
\RequirePackage{fancyvrb}
\fvset{tabsize=listingstabsize}% I don't know the correct syntax. :-)

问题是如何实现场景2?

答案1

使用源代码,卢克。查看listings.sty并查看tabsize遇到键时会发生什么。它设置了一个宏\lst@tabsize。所以这应该有效。

\makeatletter
\fvset{tabsize=\lst@tabsize}
\makeatother

但软件包的内部结构通常不能保证在未来版本中以相同的方式运行。因此,这种解决方法可能会在未来版本中被破坏。这就是为什么方案 1 是更安全的方法。

答案2

这里有两个(相当晚的)替代答案。

您需要为键赋予更多内在含义tabsize:目前,您使用它来表示“制表符大小为listings”和“制表符大小为 ” fancyvrb,但您真正的意思是“制表符大小为mylistings”,而这恰好在另外两个上下文中使用该维度。我的意思是,您应该定义自己的宏并在两个地方调用它:

\def\mytabsize{3}
% mylistings.sty
\lstset{tabsize = \mytabsize}
% mytable.sty
\fvset{tabsize = \mytabsize}

这很好,除非你期望这不是由你在幕后tabsize设置的;在这种情况下,我认为你的设计有问题。listings

我认为这根本不是一个 TeX 问题,而是一个编程问题,关于如何管理程序不同部分之间共享的资源。我给出了“静态分配”答案:程序的基本组件将资源分配给各个模块。

另一个策略是“垃圾收集”答案:要求您的模块将其使用情况报告给可以跟踪资源使用情况的中央机构。为此,您必须改变它们请求资源的方式。最有可能的是,您将定义自己的包装器宏,其副作用是您尝试传递给模块的键也会保存在您自己的注册表中:

\usepackage{pgfkeys,listings,fancyvrb}
% This defines the registry-setup key
\pgfkeys{
 /modules/new module/.style = {
  /modules/#1/.is family,
  /modules/#1/.unknown/.style = {
   /modules/#1/\pgfkeyscurrentname/.initial = ##1
  },
 },
}

% Here we add two modules to the registry: a necessary first step!
\pgfkeys{
 /modules/new module = lst,
 /modules/new module = fv,
}

% This will set keys in the corresponding module, and save them in the registry.
\newcommand{\moduleset}[2]{%
 \pgfkeys{/modules/#1, #2}%
 \csname#1set\endcsname{#2}%
}

% This gets a key from the appropriate module in the registry
\newcommand{\moduleget}[2]{%
 \pgfkeysvalueof{/modules/#1/#2}%
}

% This "copies" a key from one module to the other.
\newcommand{\modulecp}[3]{%
 \edef\key{\moduleget{#1}{#3}}
 \moduleset{#2}{#3 = \key}
}

% mylistings.sty
\moduleset{lst}{tabsize = 3}
% mytable.sty
\modulecp{lst}{fv}{tabsize}

我认为最后两个命令正是你打算编写起来很麻烦,所以我认为这是两种选择中更好的一种;它也不依赖于包的内部属性。显然,这需要编写更多代码,而且可能不值得只为了一个键,但如果您要使用许多相互关联的包,这就是将它们绑定在一起的方式。

相关内容