매크로 + 피드백으로 그룹화를 이스케이프하세요

매크로 + 피드백으로 그룹화를 이스케이프하세요

저는 현재 latex를 사용한 프로그래밍에 대해 더 깊이 이해하기 위해 latex3에서 노력하고 있습니다. 이를 위해 간단한 설정 시스템을 만들었습니다.

다음과 같이 작동합니다:

  1. 다음을 통해 설정을 만듭니다.\NewSetting[type = <type>, init = <init-value>]{<Name>}
  2. 유형에 따라 해당 설정 매크로를 호출합니다. 예를 들어 문자열 설정의 경우 를 호출합니다 \NewStringSetting[<init-value>]{<Name>}.
  3. \NewStringSetting문자열을 생성하고, 문자열의 초기 값을 설정하고, 문자열을 사용하는 데 필요한 모든 매크로(예: Clear<Name>Set<Name>) 를 생성합니다 Get<Name>.

예 |작성자에 대한 문자열 설정:

  1. 전화해서 설정을 만듭니다\NewSetting[type = string, init = Dave]{Author}
  2. 내부: \NewSetting전화\NewStringSetting[Dave]{Author}
  3. 내부: \NewStringSettingexpl3 문자열( g_my_author_str)을 생성하고, 필요한 경우 값을 설정하고 , \ClearAuthor\SetAuthor{<Content>}3 개의 매크로를 생성합니다 \GetAuthor.

이제 문자열 작성자의 콘텐츠를 지우고 설정하고 가져올 수 있습니다.

문제xkeyval: 키-값 쌍에 사용합니다 . 그룹 내에서 설정되므로 그룹을 떠난 후 재설정됩니다 \NewSetting( 참조\setkeys데이비드 칼라일의 논평). 그러나 생성된 모든 매크로( \ClearAuthor, \SetAuthor{<Content>}\GetAuthor)는 그룹을 떠난 후 정의되지 않습니다. 해결책은 그룹을 제거하는 것이지만 키-값 쌍이 의도한 대로 재설정되지 않습니다. 따라서 실제로 해결책은 아닙니다. 그러다가 우연히 발견했어요@wipet의 솔루션매크로를 그룹 외부로 전달합니다. 따라서 그룹 끝에서 모든 키가 재설정되는 동안 매크로를 유지합니다. 작동하는 솔루션처럼 보입니다.

질문: 저는 아직 LaTeX, 특히 latex3을 처음 접합니다. 나는 지금까지의 결과에 상당히 만족하지만(결과적으로는 효과가 있음) 여러분의 생각을 알고 싶습니다. 더 쉬운 방법이 있는지, 어떤 점을 개선할 수 있는지 알고 싶습니다.

제가 겪었던 가장 큰 어려움은 확장이었습니다. 좋은 참고 자료(예: Youtube, 포럼 게시물 등)가 있습니까? (특히 latex3 및 ...와 같은 기본 요소를 다루는 것 \exp_last_unbraced)

요약 요약:

  1. 코드를 어떻게 개선할 수 있나요(특히 제가 설명한 문제와 관련하여)?
  2. latex3을 설명하는 좋은 참고 자료가 있나요? (LaTeX3 매뉴얼을 알고 있습니다.)
  3. 시행착오 없이 바로 확장할 수 있는 몇 가지 경험 법칙이 있나요?

문자열 설정 코드:

\documentclass{book}

\usepackage{expl3} % Only needed for IDE-autocomplete (aka IntelliSense)
\usepackage{xkeyval}

\makeatletter
\ExplSyntaxOn

% By egreg https://tex.stackexchange.com/a/63233/293060
\NewExpandableDocumentCommand{\IfNoValueOrEmptyTF}{m m m}{%
    \IfNoValueTF{#1}{#2}{%
        \tl_if_empty:nTF{#1}{#2}{#3}%
    }%
}%

% By wipet https://tex.stackexchange.com/a/690710/293060
\def\keepaftergroup#1{%
   \global \expandafter\let \csname x:\string#1\endcsname =#1
   \aftergroup\let
   \aftergroup#1%
   \expandafter\aftergroup \csname x:\string#1\endcsname
   
}

\define@key[DAVE]{settings}{type}{\def\DAVE@Settings@Type{#1}}
\define@key[DAVE]{settings}{init}{\def\DAVE@Settings@Init{#1}}

\NewDocumentCommand{\NewSetting}{o m}{%
    \begingroup
        \setkeys[DAVE]{settings}{#1}%
        \cs_if_exist:NTF\DAVE@Settings@Type{%
            \str_case:NnF{\DAVE@Settings@Type}{%
                {string}{\begingroup\edef\x{\endgroup\noexpand\NewStringSetting[\cs_if_exist:NT\DAVE@Settings@Init{\DAVE@Settings@Init}]{#2}}\keepaftergroup\x} % <--- Wont work without \keepaftergroup, only if \begingroup + \endgroup removed (but then keys wont reset)
                %{bool}{...}
            }{%
                \ClassError{SETTINGS}{Unknown~settings~type~for~setting~'#2'}{}
            }
        }{%
            \ClassError{SETTINGS}{Cannot~create~setting~'#2'~due~to~missing~setting~type}{}
        }
    \endgroup
    \x % <--- Calling
}

\NewDocumentCommand{\NewStringSetting}{o m}{%
    \str_if_exist:cTF{g_DAVE_#2_str}{%
        \ClassError{SETTINGS}{String~with~the~name~'#2'~already~exist}{}
    }{%
        \str_gclear_new:c{g_DAVE_#2_str}
        \IfValueT{#1}{%
            \str_gset:cn{g_DAVE_#2_str}{#1}
        }
        \expandafter\NewExpandableDocumentCommand\expandafter{\csname Clear#2\endcsname}{}{%
            \str_gclear:c{g_DAVE_#1_str}
        }
        \expandafter\NewExpandableDocumentCommand\expandafter{\csname Set#2\endcsname}{m}{%
            \IfNoValueOrEmptyTF{##1}{%
                \ClassWarning{SETTINGS}{Could~not~set~value~for~setting~'#2'~due~to~the~passed~value~being~of~type~'NoValue'~or~empty}%
            }{%
                \str_gset:cn{g_DAVE_#2_str}{##1}%
            }%
        }
        \expandafter\NewExpandableDocumentCommand\expandafter{\csname Get#2\endcsname}{}{%
            \str_use:c{g_DAVE_#2_str}
        }
    }
}

\ExplSyntaxOff
\makeatother

\NewSetting[type = string]{Forum}
\NewSetting[type = string, init = Dave]{Author}

\SetForum{StackExchange}

\begin{document}
    Hello \TeX-\GetForum \space it's \GetAuthor
\end{document}

관련 정보