Komma oder und bei Aufzählung mit variabler Anzahl an Argume

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Komma oder und bei Aufzählung mit variabler Anzahl an Argume

von cgnieder » Mi 5. Okt 2016, 11:22

thomasninty hat geschrieben:Leider wird die Unterscheidung, ob "," oder "und" verwendet werden soll nicht immer. Habt ihr eine Idee woran das liegt?
Das liegt daran, dass die verschiedenen Teile bei diesem Ansatz nie leer sind. Aus Sicht von dem \seq_use:Nnnn hat die Sequence in Deinem Beispiel immer drei Teile, die nur eben manchmal keine sichtbare Ausgabe erzeugen.

von thomasninty » Mi 5. Okt 2016, 09:28

Schon mal vielen Dank für eure Hilfe. Ich bekomme es allerdings noch immer nicht so richtig ans laufen.
Und zwar möchte ich die Teile Teil 1, Teil 2 und Teil 3 über eine if-Abfrage einbinden. In etwa so:
\documentclass[a4paper,oneside,10pt]{report} 
\usepackage{german,a4}			
\usepackage[T1]{fontenc} 		
\usepackage[ansinew]{inputenc} 
\usepackage{lmodern} 
\usepackage{ifthen} 
\usepackage{xparse}

\newboolean{Teil1}
\newboolean{Teil2}
\newboolean{Teil3}
\setboolean{Teil1}{true}
\setboolean{Teil2}{true}
\setboolean{Teil3}{true}

\ExplSyntaxOn 
\seq_new:N \l_thomasninty_satz_seq 
\cs_new_protected:Npn \thomasninty_satz:n #1 
{ 
	\seq_set_from_clist:Nn \l_thomasninty_satz_seq {#1} 
	\seq_use:Nnnn \l_thomasninty_satz_seq 
	{ ~ und ~ } % wenn es nur zwei sind 
	{ , ~ }     % wenn es mehr als zwei sind 
	{ ~ und ~ } % zwischen den letzten zwei bei mehr als zwei 
} 

\NewDocumentCommand \Satz {m} 
{ \thomasninty_satz:n {#1} } 
\ExplSyntaxOff 



\begin{document}

\Satz{\ifTeil1 Teil 1 \fi ifTeil2 , Teil 2 \fi \ifTeil3 Teil 3 \fi} 

\end{document}

Hintergrund ist, dass je nachdem ob einer der Teile in einer anderen Datei als true oder als false deklariert wurde, der entsprechende Teil eingebunden wird oder nicht. Das klappt auch einigermaßen. Leider wird die Unterscheidung, ob "," oder "und" verwendet werden soll nicht immer. Habt ihr eine Idee woran das liegt? Oder bin ich komplett auf dem Holzweg?

Gruß,
Thomas

von cgnieder » Di 4. Okt 2016, 20:40

Hier ein Beispiel analog zu Saputellos mit etoolbox:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{etoolbox}

\newcommand\Satz[3]{Dieser Text enthält #1\ifblank{#3}{ und #2}{, #2 und #3}.}

\begin{document}

\Satz{Teil 1}{Teil 2}{Teil 3}

\Satz{Teil 1}{Teil 2}{}

\end{document}
Mit expl3 geht das noch leichter und flexibler:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \l_thomasninty_satz_seq
\cs_new_protected:Npn \thomasninty_satz:n #1
  {
    \seq_set_from_clist:Nn \l_thomasninty_satz_seq {#1}
    \seq_use:Nnnn \l_thomasninty_satz_seq
      { ~ und ~ } % wenn es nur zwei sind
      { , ~ }     % wenn es mehr als zwei sind
      { ~ und ~ } % zwischen den letzten zwei bei mehr als zwei
  }

\NewDocumentCommand \Satz {m}
  { \thomasninty_satz:n {#1} }
\ExplSyntaxOff

\begin{document}

\Satz{Teil 1, Teil 2, Teil 3}

\Satz{Teil 1, Teil 2}

\Satz{Teil 1, Teil 2, Teil 3, Teil 4}

\end{document}
Grüße

von thomasninty » Di 4. Okt 2016, 13:18

Danke für die schnelle Antwort.
Oh ja stimmt, da bin ich versehentlich in die falsche Rubrik gerutscht. Tut mir leid.

von saputello » Di 4. Okt 2016, 13:16

Viel zu umständlich. Das geht ganz ohne zusätzliche Schalter:
\documentclass[a4paper,oneside,10pt]{report}
\usepackage[ngerman]{babel}% german ist veraltet, a4 ist ein no-go (siehe l2tabu)
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}% Kein moderner Editor hat ansinew als Codierung voreingestellt.
\usepackage{lmodern}
\usepackage{scrbase}% stellt \IfArgIsEmpty bereit siehe scrguide.pdf

\begin{document}
\newcommand{\Satz} [3]{Dieser Text enthält #1\IfArgIsEmpty{#3}{ und #2}{, #2 und #3}.}

\Satz{Teil 1}{Teil 2}{Teil 3}

\Satz{Teil 1}{Teil 2}{}

\end{document}
Ich würde allerdings eher eine Listenverarbeitung verwenden. Siehe dazu etoolbox. Dabei braucht man dann keine leeren Argumente, wenn man nur 2 statt 3 Elemente hat.

BTW: Das ist hier das komplett falsche Forum für die Frage. Das Forum "Links" ist ausschließlich für das Posten von sehr nützlichen Links rund um TeX. Deine Frage wäre besser aufgehoben unter Eigene Strukturen.

Komma oder und bei Aufzählung mit variabler Anzahl an Argume

von thomasninty » Di 4. Okt 2016, 12:55

Hallo zusammen,
ich habe ein Problem mit der Erstellung eines Dokuments. Ich möchte ein Dokument erstellen, in dem ich abhängig vom Umfang der zu bearbeitenden Unterpunkte den Text anpassen kann. Ich hatte mir das ungefähr so gedacht:
\documentclass[a4paper,oneside,10pt]{report} 
\usepackage{german,a4}			
\usepackage[T1]{fontenc} 		  
\usepackage[ansinew]{inputenc} 
\usepackage{lmodern}
\usepackage{ifthen}

\newboolean{Teil1}
\newboolean{Teil2}
\newboolean{Teil3}

\setboolean{Teil1}{true}
\setboolean{Teil2}{true}
\setboolean{Teil3}{true}

\begin{document}
\newcommand{\Satz} [3]{Dieser Text enthält #1, #2  und #3.}

\Satz{\ifTeil1 Teil 1\fi}{\ifTeil2 Teil 2\fi}{\ifTeil3 Teil 3\fi} \\


\end{document}
 
Als Ausgabe sollte erscheinen: "Dieser Text enthält Teil 1, Teil 2 und Teil 3."

Mein Problem ist nun, das es vorkommen kann das der Text Teil 3 nicht enthalten soll und daher Teil3 = false gilt. In der Ausgabe würde dann erscheinen: "Dieser Text enthält Teil 1, Teil 2."

Wie kann ich es machen, dass in einem solchen Fall automatisch ein "und" statt einem "," erscheint? Also: "Dieser Text enthält Teil 1 und Teil 2."

Vielen Dank vorab,
thomasninty

Nach oben