Gruppierung als Makro entkommen + Feedback

Gruppierung als Makro entkommen + Feedback

Ich versuche mich derzeit an Latex3, um ein tieferes Verständnis für die Programmierung mit Latex zu bekommen. Hierzu habe ich ein einfaches Einstellungssystem erstellt.

Es funktioniert wie folgt:

  1. Sie erstellen eine Einstellung über\NewSetting[type = <type>, init = <init-value>]{<Name>}
  2. Basierend auf seinem Typ ruft es das entsprechende Einstellungsmakro auf: Für eine Zeichenfolgeneinstellung wird beispielsweise aufgerufen \NewStringSetting[<init-value>]{<Name>}.
  3. \NewStringSettingerstellt die Zeichenfolge, legt den Anfangswert der Zeichenfolge fest und erstellt alle erforderlichen Makros zur Verwendung der Zeichenfolge, z. Clear<Name>B. Set<Name>und Get<Name>.

Beispiel |Eine Zeichenfolgeneinstellung für den Autor:

  1. Ich erstelle eine Einstellung durch den Aufruf\NewSetting[type = string, init = Dave]{Author}
  2. Intern: \NewSettingAnrufe\NewStringSetting[Dave]{Author}
  3. Intern: \NewStringSettingerstellt einen expl3-String ( g_my_author_str), legt bei Bedarf einen Wert fest und erstellt 3 Makros: \ClearAuthor, \SetAuthor{<Content>}und \GetAuthor.

Jetzt kann ich den Inhalt für den String-Autor löschen, festlegen und abrufen.

Problem: Ich verwende xkeyvalfür Schlüssel-Wert-Paare. Diese werden innerhalb einer Gruppe gesetzt, so dass sie nach Verlassen der Gruppe zurückgesetzt werden ( \NewSettingsiehe\setkeysKommentar von David Carlisle). Aber dann sind alle erstellten Makros ( \ClearAuthor, \SetAuthor{<Content>}und \GetAuthor) nach dem Verlassen der Gruppe undefiniert. Eine Lösung wäre, die Gruppe zu entfernen, aber dann werden die Schlüssel-Wert-Paare nicht wie vorgesehen zurückgesetzt. Also keine wirkliche Lösung. Dann bin ich über@wipets Lösungum die Makros aus der Gruppe weiterzuleiten; so bleiben die Makros erhalten, während am Ende der Gruppe trotzdem alle Tasten zurückgesetzt werden. Sieht nach einer funktionierenden Lösung aus.

Frage: Ich bin noch ziemlich neu bei LaTeX, insbesondere bei Latex3. Ich bin bisher ziemlich zufrieden mit dem Ergebnis (es funktioniert immerhin), aber ich würde gerne wissen, was Sie denken. Ich würde gerne wissen, ob es einen einfacheren Weg gibt und was ich verbessern könnte.

Die größte Schwierigkeit war für mich die Erweiterung. Gibt es gute Referenzen (z. B. YouTube, Forenbeiträge usw.)? (insbesondere solche, die sich auch mit Latex3 und seinen Grundelementen befassen, wie \exp_last_unbraced...)

Summa summarum:

  1. wie könnte der Code verbessert werden (insbesondere im Hinblick auf das von mir beschriebene Problem)?
  2. gibt es gute Referenzen, die Latex3 erklären (ich kenne das Handbuch zu LaTeX3)?
  3. Gibt es eine Faustregel, um die Erweiterung ohne Versuch und Irrtum richtig hinzubekommen?

Code der Saiteneinstellung:

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

verwandte Informationen