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 '17, 21:20

Cletus's gravatar image

Cletus
1.6k45566
Akzeptiert-Rate: 75%

bearbeitet 08 Apr '17, 21: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 '17, 14:51

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 09 Apr '17, 15: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 '17, 19:52) Cletus

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

(10 Apr '17, 09:38) cgnieder

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 '17, 10:41

Epllus's gravatar image

Epllus
620269
Akzeptiert-Rate: 46%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×13
×2

gestellte Frage: 08 Apr '17, 21:20

Frage wurde gesehen: 5,522 Mal

zuletzt geändert: 10 Apr '17, 09:38