我刚刚设法用 创建了我的第一个命令pgfkeys
。我定义了一个命令\myset
,其目的是使(例如)
\myset[big]{abc}
相当于
\bigl\{abc\bigr\}
我的目标之一是通过一种方式来实现这一点,以便我以后可以使用不同的分隔符轻松创建变体;特别是,我不希望我的\pgfkeys
代码引用\{
and \}
。
工作于这个 TeX.SE 线程和PGF 手册的相关章节,以下是我得出的结论:
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{/delimitersizes/.is family, /delimitersizes,
default/.style = {auto},
auto/.style = {leftsize = auto, rightsize = auto},
big/.style = {leftsize = big, rightsize = big},
bigg/.style = {leftsize = bigg, rightsize = bigg},
Big/.style = {leftsize = Big, rightsize = Big},
Bigg/.style = {leftsize = Bigg, rightsize = Bigg},
leftsize/.style = {leftdictionary/#1/.get = \leftdelimitersize},
rightsize/.style = {rightdictionary/#1/.get = \rightdelimitersize},
leftdictionary/.cd,
big/.initial = \bigl,
bigg/.initial = \biggl,
Big/.initial = \Bigl,
Bigg/.initial = \Biggl,
auto/.initial = \left, }
\pgfkeys{/delimitersizes, rightdictionary/.cd,
big/.initial = \bigr,
bigg/.initial = \biggr,
Big/.initial = \Bigr,
Bigg/.initial = \Biggr,
auto/.initial = \right, }
\newcommand{\myset}[2][]{
\pgfkeys{delimitersizes, default, #1}
\leftdelimitersize\{#2\rightdelimitersize\} }
\begin{document}
$\myset[big]{abc}$
\end{document}
它按预期运行,但考虑到成品,似乎存在大量“代码重复”,并且在使用之前对信息进行了调整。我知道这是一个相当开放的问题,但有人能建议如何改进此代码以使其更紧凑和精简吗?
答案1
这更加简化,但我不确定在这种情况下是否需要使用 pgf。
\documentclass{article}
\newcommand\myset[2][big]{\csname#1l\endcsname\{#2\csname#1r\endcsname\}}
\begin{document}
$\myset{abc}$ $\myset[Bigg]{xyz}$
\end{document}
答案2
我认为大卫有权利这么做,但如果你想这么做某物像这样pgfkeys
,这是我喜欢的风格。我花了很长时间才弄好,虽然我认为一年前,在我不再练习之前,它不会弄好。这也是反对以这种方式做如此简单的事情的理由。
\documentclass{standalone}
\usepackage{pgfkeys,pgffor}
\pgfkeys{/delimitersizes/.cd,
util/create/.style = {
util/name = #1,
util/dict =
{#1}
{\csname#1l\endcsname}
{\csname#1r\endcsname}
},
util/name/.style = {
#1/.style = {
leftsize = #1,
rightsize = #1
}
},
util/dict/.style n args = {3}{
leftdictionary/#1/.initial/.expand once = #2,
rightdictionary/#1/.initial/.expand once = #3
},
leftsize/.style = {
leftdictionary/#1/.get = \leftdelimitersize
},
rightsize/.style = {
rightdictionary/#1/.get = \rightdelimitersize
},
default/.style = auto,
util/create/.list = {big,bigg,Big,Bigg},
% Treat auto specially
util/name = auto,
util/dict = {auto}{\noexpand\left}{\noexpand\right}
}
\newcommand{\myset}[2][]{
\pgfkeys{/delimitersizes/.cd,default,#1}
\leftdelimitersize\{#2\rightdelimitersize\}
}
\begin{document}
$\myset[big]{abc}$
$\myset[Big]{abc}$
$\myset[bigg]{abc}$
$\myset[Bigg]{abc}$
\end{document}
基本上,你创建了一堆实用键,它们负责定义你实际上使用,然后反复调用实用程序键。这由永远有用的.list
处理程序实现,我猜这是代码重复减少策略的核心。请注意,如果您要调用通过 .loop 进行分配的键,则这些分配必须全局进行,否则(由于\foreach
在组中运行)它们将丢失。