
Acabo de lograr crear mi primer comando con pgfkeys
. Definí un comando \myset
, cuyo propósito es hacer (por ejemplo)
\myset[big]{abc}
corresponden a las
\bigl\{abc\bigr\}
Parte de mi objetivo era hacer esto de una manera que me permitiera crear variantes más adelante, usando diferentes delimitadores; en particular, no quería que mi \pgfkeys
código hiciera referencia a \{
y \}
.
Trabajando desdeeste hilo TeX.SEyla sección correspondiente del manual de PGF, esto es lo que se me ocurrió:
\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}
Esto funciona como se supone, pero considerando el producto terminado, parece que hay una cantidad significativa de "duplicación de código" y confusión de información antes de usarlo. Me doy cuenta de que esta es una pregunta bastante abierta, pero ¿pueden las personas sugerir cómo mejorar este código para hacerlo más compacto y optimizado?
Respuesta1
Esto es más sencillo, pero no estoy seguro de si usar pgf era un requisito en este caso.
\documentclass{article}
\newcommand\myset[2][big]{\csname#1l\endcsname\{#2\csname#1r\endcsname\}}
\begin{document}
$\myset{abc}$ $\myset[Bigg]{xyz}$
\end{document}
Respuesta2
Creo que David tiene razón, pero si quieres hacerloalgoMe gusta este con pgfkeys
, este es el estilo que me gusta. Me llevó demasiado tiempo hacerlo bien, aunque creo que hace un año, antes de dejar de practicar, no lo habría hecho. Este también es un argumento en contra de hacer las cosas de esta manera para algo tan simple.
\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}
Básicamente, creas un conjunto de claves de utilidad que hacen el trabajo de definir las claves quede hechouse y luego llame a las teclas de utilidad repetidamente. Esto se ve facilitado por el siempre útil .list
controlador, que supongo que es el núcleo de la estrategia de reducción de la repetición de código. Tenga en cuenta que si fuera a llamar teclas que realizaron asignaciones a través de .loop, esas asignaciones tendrían que realizarse globalmente o de lo contrario (dado que \foreach
se ejecuta en un grupo) se perderían.