Como tornar esse código pgfkeys mais compacto e simplificado?

Como tornar esse código pgfkeys mais compacto e simplificado?

Acabei de conseguir criar meu primeiro comando com pgfkeys. Eu defini um comando \myset, cujo objetivo é fazer (por exemplo)

\myset[big]{abc}

Corresponde a

\bigl\{abc\bigr\}

Parte do meu objetivo era fazer isso de uma forma que me permitisse facilmente criar variantes posteriormente, usando delimitadores diferentes; em particular, eu não queria que meu \pgfkeyscódigo se referisse a \{and \}.

Trabalhando deeste tópico TeX.SEea seção relevante do manual PGF, aqui está o que eu descobri:

\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}

Isso funciona como deveria, mas considerando o produto final, parece que há uma quantidade significativa de "duplicação de código" e confusão de informações antes de começar a usá-lo. Sei que esta é uma questão bastante aberta, mas as pessoas podem sugerir como melhorar este código para torná-lo mais compacto e simplificado?

Responder1

Isso é mais simplificado, mas não tenho certeza se o uso do pgf era um requisito neste caso.

\documentclass{article}

\newcommand\myset[2][big]{\csname#1l\endcsname\{#2\csname#1r\endcsname\}}

\begin{document}

$\myset{abc}$  $\myset[Bigg]{xyz}$

\end{document}

insira a descrição da imagem aqui

Responder2

Acho que David tem razão, mas se você quiser fazeralgoassim com pgfkeys, aqui está o estilo que eu gosto. Levei muito tempo para acertar, embora eu ache que há um ano, antes de perder a prática, não teria acontecido. Este também é um argumento contra fazer as coisas desta forma para algo tão simples.

\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}

Basicamente, você cria um monte de chaves utilitárias que fazem o trabalho de definir as chaves que vocêna verdadeuse e, em seguida, chame as teclas de utilitário repetidamente. Isso é facilitado pelo .listmanipulador sempre útil, que acredito ser o núcleo da estratégia de redução de repetição de código. Observe que se você fosse chamar chaves que fizeram atribuições via .loop, essas atribuições teriam que ser feitas globalmente ou então (já que \foreachsão executadas em grupo) elas seriam perdidas.

informação relacionada