この 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、これが私が好きなスタイルです。これを正しく行うのに時間がかかりすぎましたが、1年前、練習を怠る前であれば、そうはならなかったと思います。これは、非常に単純なことをこのように行うことに反対する議論でもあります。

\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グループで実行されるため)、割り当てが失われることに注意してください。

関連情報