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

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


thomasninty
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Di 4. Okt 2016, 12:34

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

Beitrag von thomasninty »

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:

Code: Alles auswählen

\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

saputello
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 98
Registriert: Do 15. Jan 2015, 08:49

Beitrag von saputello »

Viel zu umständlich. Das geht ganz ohne zusätzliche Schalter:

Code: Alles auswählen

\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.

thomasninty
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Di 4. Okt 2016, 12:34

Beitrag von thomasninty »

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

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 705
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

Hier ein Beispiel analog zu Saputellos mit etoolbox:

Code: Alles auswählen

\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:

Code: Alles auswählen

\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
Clemens

thomasninty
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Di 4. Okt 2016, 12:34

Beitrag von thomasninty »

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:

Code: Alles auswählen

\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

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 705
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag von cgnieder »

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.
Clemens

Antworten