
Мне только что удалось создать свою первую команду с помощью pgfkeys
. Я определил команду \myset
, цель которой — сделать (например)
\myset[big]{abc}
соответствуют
\bigl\{abc\bigr\}
Одной из моих целей было сделать это таким образом, чтобы впоследствии я мог легко создавать варианты, используя другие разделители; в частности, я не хотел, чтобы мой \pgfkeys
код ссылался на \{
и \}
.
Работаем изэта ветка 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
выполняется в группе) они будут потеряны.