如何讓這個pgfkeys程式碼更加緊湊精簡?

如何讓這個pgfkeys程式碼更加緊湊精簡?

我剛剛成功創建了我的第一個命令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在群組中執行)它們將會遺失。

相關內容