Um eine Code-Verdopplung zu vermeiden, benötige ich etwas wie \clist_if_in_p:cn. expl3 sieht die Variante mit _p aber nicht vor, d. h. die Funktion kann nicht in booleschen Ausdrücken verwendet werden. Wie sollte ich vorgehen, um folgendes Beispiel lauffähig zu machen?

Öffne in Overleaf
\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\clist_const:Nn \c_meinmodul_A_clist {a, b, c, d, e}
\clist_const:Nn \c_meinmodul_B_clist {c, d, e, f, g}

\cs_new:Npn \meinmodul_testfunktion:nn #1#2
  {
    \bool_lazy_any:nTF
      {
        { \bool_lazy_and_p:nn { \clist_if_exist_p:c {c_meinmodul_#2_clist} }
                              { \clist_if_in_p:cn {c_meinmodul_#2_clist} {#1} } }
        % Es folgende weitere Bedingungen, die hier nicht relevant sind.
      }
      {
        Ja.
      }
      {
        Nein.
      }
  }

\NewDocumentCommand \IstEnthalten {m m}
  {
    \meinmodul_testfunktion:nn {#1} {#2}
  }

\ExplSyntaxOff

\begin{document}

\IstEnthalten{f}{A} % Nein
\IstEnthalten{f}{B} % Ja
\IstEnthalten{f}{C} % Nein, Liste C nicht definiert

\end{document}

gefragt 08 Apr, 15:20

Cletus's gravatar image

Cletus
1.2k1037
Akzeptiert: 73%

bearbeitet 08 Apr, 15:23


Der Test \clist_if_in:NnTF ist nicht expandierbar, weshalb es auch kein predicate gibt. Aber Du kannst den Test ja einfach von den anderen abtrennen. Die Code-Verdopplung vermeidest Du dann am einfachsten, indem Du einfach ein neues Conditional definierst:

Öffne in Overleaf
\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\clist_const:Nn \c_meinmodul_A_clist {a, b, c, d, e}
\clist_const:Nn \c_meinmodul_B_clist {c, d, e, f, g}

\prg_new_protected_conditional:Npnn \meinmodul_testfunktion:nn #1#2 {T,F,TF}
  {
    \clist_if_exist:cTF {c_meinmodul_#2_clist}
      {
        \clist_if_in:cnTF {c_meinmodul_#2_clist} {#1}
          {
            % andere Bedingungen:
            \bool_if:nTF { \c_true_bool }
              { \prg_return_true: }
              { \prg_return_false: }
          }
          { \prg_return_false: }
      }
      { \prg_return_false: }
  }

\NewDocumentCommand \IstEnthalten {m m}
  { \meinmodul_testfunktion:nnTF {#1} {#2} {ja} {nein} }

\ExplSyntaxOff

\begin{document}

\IstEnthalten{f}{A} % Nein
\IstEnthalten{f}{B} % Ja
\IstEnthalten{f}{C} % Nein, Liste C nicht definiert

\end{document}

Ergebnis:

nein ja nein

Permanenter link

beantwortet 09 Apr, 08:51

Clemens's gravatar image

Clemens
19.9k113360

bearbeitet 09 Apr, 09:27

Die weiteren Bedingungen, die ich oben ausgelassen habe, sollen mit der genannten Bedingung verodert, nicht verundet werden (daher das \bool_lazy_any). Ich denke aber, dass man deinen Code leicht hierfür anpassen kann.

(09 Apr, 13:52) Cletus

@Cletus das sollte tatsächlich leicht möglich sein

(10 Apr, 03:38) Clemens

Ich glaube es ist am einfachsten, wenn du die beiden Tests, ob die Liste existiert und ob etwas enthalten ist, vor dem \bool_lazy_any durchführst.

Öffne in Overleaf
\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\clist_const:Nn \c_meinmodul_A_clist {a, b, c, d, e}
\clist_const:Nn \c_meinmodul_B_clist {c, d, e, f, g}

\cs_new:Npn \meinmodul_testfunktion:nn #1#2
  {
    %% man kann (sollte?) auch einen anderen boolean als \l_tmpa_bool verwenden.
    \clist_if_exist:cTF { c_meinmodul_#2_clist }
      {
        \clist_if_in:cnTF { c_meinmodul_#2_clist } {#1}
          { \bool_set_true:N \l_tmpa_bool }
          { \bool_set_false:N \l_tmpa_bool }
      }{
        \bool_set_false:N \l_tmpa_bool
      }
    \bool_lazy_any:nTF
      {
        { \l_tmpa_bool } %% etc.
      }
      {
        Ja.
      }
      {
        Nein.
      }
  }

\NewDocumentCommand \IstEnthalten {m m}
  {
    \meinmodul_testfunktion:nn {#1} {#2}
  }

\ExplSyntaxOff

\begin{document}

\IstEnthalten{f}{A} % Nein
\IstEnthalten{f}{B} % Ja
\IstEnthalten{f}{C} % Nein, Liste C nicht definiert

\end{document}

Ich kenne deinen Code nicht genau, aber du könntest noch eine Warnung oder Ähnliches einbauen falls die Liste nicht definiert ist (hilft gegen Tippfehler).

Permanenter link

beantwortet 09 Apr, 04:41

Epllus's gravatar image

Epllus
61069

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×9
×2

Frage gestellt: 08 Apr, 15:20

Frage wurde angeschaut: 398 Mal

Zuletzt aktualisiert: 10 Apr, 03:38