
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 \pgfkeys
có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}
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 .list
manipulador 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 \foreach
são executadas em grupo) elas seriam perdidas.