이 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

내 생각엔 David가 그럴 권리가 있다고 생각하지만, 당신이 원한다면무엇와 같이 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그룹에서 실행되므로) 할당이 손실됩니다.

관련 정보