Wie kann dieser pgfkeys-Code kompakter und schlanker gemacht werden?

Wie kann dieser pgfkeys-Code kompakter und schlanker gemacht werden?

Ich habe es gerade geschafft, meinen ersten Befehl mit zu erstellen pgfkeys. Ich habe einen Befehl definiert \myset, dessen Zweck es ist, (zum Beispiel)

\myset[big]{abc}

entsprechen

\bigl\{abc\bigr\}

Teilweise bestand mein Ziel darin, dies auf eine Weise zu tun, die es mir später problemlos ermöglicht, Varianten mit anderen Trennzeichen zu erstellen. Insbesondere wollte ich nicht, dass mein \pgfkeysCode auf das \{„und“ verweist \}.

Arbeiten vondieser TeX.SE-ThreadUndder entsprechende Abschnitt des PGF-Handbuchs, hier ist, was mir eingefallen ist:

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

Dies funktioniert wie vorgesehen, aber wenn man das fertige Produkt betrachtet, scheint es eine erhebliche Menge an „Code-Duplikation“ und Informationsverschiebungen zu geben, bevor man sie verwenden kann. Mir ist klar, dass dies eine eher offene Frage ist, aber kann jemand Vorschläge machen, wie man diesen Code verbessern könnte, um ihn kompakter und schlanker zu machen?

Antwort1

Dies ist rationalisierter, aber ich bin nicht sicher, ob die Verwendung von PGF in diesem Fall eine Voraussetzung war.

\documentclass{article}

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

\begin{document}

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

\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ich denke, David hat das Recht dazu, aber wenn Sie wollenetwasso mit pgfkeys, das ist der Stil, den ich mag. Ich habe viel zu lange gebraucht, um das richtig hinzubekommen, obwohl ich glaube, vor einem Jahr, bevor ich aus der Übung kam, wäre das nicht der Fall gewesen. Das ist auch ein Argument dagegen, Dinge auf diese Weise zu machen, wenn es um etwas so Einfaches geht.

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

Im Grunde erstellen Sie eine Reihe von Dienstprogrammschlüsseln, die die Arbeit der Definition der Schlüssel übernehmen, die SieGenau genommenverwenden und dann die Utility-Tasten wiederholt aufrufen. Dies wird durch den immer nützlichen .listHandler erleichtert, der vermutlich der Kern der Strategie zur Reduzierung der Codewiederholung ist. Beachten Sie, dass, wenn Sie Tasten aufrufen würden, die Zuweisungen über .loop vorgenommen haben, diese Zuweisungen global vorgenommen werden müssten, da \foreachsie sonst (da es in einer Gruppe ausgeführt wird) verloren gehen würden.

verwandte Informationen