Seite 1 von 1
Abfrage: ist ein Element in einer Menge enthalten?
Verfasst: Mo 18. Apr 2016, 12:41
von ravintastentyp123
Hallo zusammen,
ich benötige grade einen Funktion, die mir sagt, ob ein Element in einer Menge enthalten ist. Ist also beispielsweise X={a,b,c} die zu durchsuchende Menge und d ein Element, für das ich entscheiden will, ob es in der Menge enthalten ist, so benötige ich eine Funktion f(d,X), die den Wert 1 annimmt, wenn d=a oder d=b oder d=c, und sonst 0.
Weiß hier jemand, wie eine solche Abfrage zu programmieren wäre?
Vielen Dank schon einmal!
Christian
Verfasst: Mo 18. Apr 2016, 12:47
von Besserwisser
Wo ist das
Minimalbeispiel zur Frage?
Wie hast du denn die Mengen definiert? Falls du sie noch gar nicht definiert hast: LaTeX3 hat auch Funktionen für Listen.
Verfasst: Mo 18. Apr 2016, 12:51
von cgnieder
Da gibt es
so viele verschiedene Möglichkeiten, dass man nicht weiß, was man raten soll, wenn man Deine konkrete Anwendung nicht kennt. Ist die Liste tatsächlich eine csv-Liste? Kann die Liste alles enthalten? Ist die Liste konstant, oder soll sie per Input veränderbar sein? Soll die Abfrage expandierbar sein? Und, und, und, …
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\NewDocumentCommand \funktion {mmmm}
{ \clist_if_in:nnTF {#1} {#2} {#3} {#4} }
\ExplSyntaxOff
\begin{document}
\funktion{a,b,c}{d}{1}{0} = 0
\funktion{a,b,c}{a}{1}{0} = 1
\end{document}
Grüße
Verfasst: Mo 18. Apr 2016, 13:06
von ravintastentyp123
Hallo Clemens,
danke für die Antwort! Also, die Mengen/Listen werden vorher im Latex-Code per (re)newcommand festgelegt und trennen die Elemente tatsächlich immer per Komma. (Jede Liste steht dann für eine Menge von Elementen, die eine bestimmte Eigenschaft haben, und die Abfrage soll dann klären, ob das eine spezifische Element eine bestimmte Eigenschaft hat.) Entsprechend sind die Listen auch unterschiedlich lang.
Verfasst: Mo 18. Apr 2016, 13:08
von cgnieder
Was ich eigentlich meinte, war: [mm][/mm] Dann kann man Dir was passendes vorschlagen…
Grüße
Verfasst: Mo 18. Apr 2016, 15:37
von ravintastentyp123
Okay, ich habe jetzt mal zusammengestellt, was ich bisher habe. Du siehst dann in dem Dokument, was schief läuft:
\documentclass[a4paper,12pt]{article}
\usepackage{ifthen,pgffor}
\newcommand{\ifiselementof}[4]{\foreach \element in #2 {\ifthenelse{\equal{\element}{#1}}{#3}{#4}}}
\newcommand{\setX}{a,b,c,d}
\newcommand{\setY}{a}
\begin{document}
Positivbsp: Menge Y = \setY\\
\foreach \elementX in \setX
{\ifiselementof{\elementX}{\setY}{Element \elementX\ ist auch in Menge Y.\\}{Element \elementX\ ist nicht in Menge Y.\\}}
\renewcommand{\setY}{a,b,c}
Negativbsp: Menge Y = \setY\\
\foreach \elementX in \setX
{\ifiselementof{\elementX}{\setY}{Element \elementX\ ist auch in Menge Y.\\}{Element \elementX\ ist nicht in Menge Y.\\}}
\end{document}
Verfasst: Do 21. Apr 2016, 11:50
von cgnieder
Dann vielleicht so:
\documentclass[a4paper,12pt]{article}
\usepackage{pgffor,etoolbox}
\newbool{iselement}
% #1: control sequence containing element to check
% #2: control sequence containing csv list of elements
% #3: true
% #4: false
\newcommand\checkelement[4]{%
\global\boolfalse{iselement}%
\foreach \Y in #2 {%
\ifx#1\Y
\global\booltrue{iselement}%
\fi
}%
\ifbool{iselement}{#3}{#4}%
}
% #1 (optional): control sequence containing element of first set
% #2: control sequence containing first csv list of elements
% #3: control sequence containing second csv list of elements
% #4: true
% #5: false
\newcommand\checksets[5][\X]{%
\foreach #1 in #2 {%
\checkelement#1{#3}{#4}{#5}%
}%
}
\begin{document}
\newcommand{\setX}{a,b,c,d}
\newcommand{\setY}{a}
Positivbsp: Menge Y = \setY
\checksets{\setX}{\setY}
{Element \X\ ist auch in Menge Y.\par}
{Element \X\ ist nicht in Menge Y.\par}
\bigskip
\renewcommand{\setY}{a,b,c}
Negativbsp: Menge Y = \setY
\checksets[\elementX]{\setX}{\setY}
{Element \elementX\ ist auch in Menge Y.\par}
{Element \elementX\ ist nicht in Menge Y.\par}
\end{document}
Grüße