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, 15:20

Cletus's gravatar image

Cletus
1.2k1945
Akzeptiert: 72%

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

Clemens's gravatar image

Clemens
20.3k123460

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

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

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

×10
×2

Frage gestellt: 08 Apr '17, 15:20

Frage wurde angeschaut: 882 Mal

Zuletzt aktualisiert: 10 Apr '17, 03:38