public IEnumerable <ITextUnit> GetTextUnits(ComponentPart componentPart, Template template, Citation citation, out bool handled)
        {
            //return handled = true if this macro generates the output (as a IEnumerable<ITextUnit>); the standard output will be suppressed
            //return handled = false if you want Citavi to produce the standard output;
            //you can still manipulate the component part and its elements before letting Citavi generate the output with handled = false
            handled = false;

            /*
             * AUSGABE-ZIELE
             * ------------------------------------------------------------------------------------------------------------------------
             * [1] Aufsatz-Seiten: 123-130      Zitatseiten: -          > AUSGABE: 123-130          [= nur Aufsatzseiten]
             * [2] Aufsatz-Seiten: 123-130		Zitatseiten: 123		> AUSGABE: 123				[= nur Zitatseiten]
             * [3] Aufsatz-Seiten: 123-130		Zitatseiten: 123-124	> AUSGABE: 123 f.			[= nur Zitatseiten]
             * [4] Aufsatz-Seiten: 123-130		Zitatseiten: 123-125	> AUSGABE: 123 ff.			[= nur Zitatseiten]
             * [5] Aufsatz-Seiten: 123-130		Zitatseiten: 125		> AUSGABE: 123 (125)		[= Erste Aufsatzseite (Zitatseiten)]
             * [6] Aufsatz-Seiten: 123-130		Zitatseiten: 125-126	> AUSGABE: 123 (125 f.)		[= Erste Aufsatzseite (Zitatseiten)]
             * [7] Aufsatz-Seiten: 123-130		Zitatseiten: 125-127	> AUSGABE: 123 (125 ff.)	[= Erste Aufsatzseite (Zitatseiten)]
             */


            if (componentPart == null)
            {
                return(null);
            }
            if (componentPart.Elements == null || componentPart.Elements.Count == 0)
            {
                return(null);
            }


            if (citation == null)
            {
                return(null);
            }
            if (citation.Reference == null)
            {
                return(null);
            }

            var placeholderCitation = citation as PlaceholderCitation;

            if (placeholderCitation == null)
            {
                return(null);
            }
            if (placeholderCitation.Entry == null)
            {
                return(null);
            }

            //[1]
            if (placeholderCitation.Entry.PageRange == null)
            {
                return(null);
            }
            if (string.IsNullOrEmpty(placeholderCitation.Entry.PageRange.PrettyString))
            {
                return(null);                                                                                           //ElementApplyConditions sorgen dafür, dass keine leeren Klammern angezeigt werden
            }
            //enthält nur 1 PageRangeFieldElement und 1 QuotationPageRangeFieldElement und sonst lediglich LiteralElemente
            PageRangeFieldElement          pageRangeFieldElement          = null;
            QuotationPageRangeFieldElement quotationPageRangeFieldElement = null;

            if (!TryValidateComponentPartStructure(componentPart, out pageRangeFieldElement, out quotationPageRangeFieldElement))
            {
                return(null);
            }

            if
            (
                !citation.Reference.HasCoreField(ReferenceTypeCoreFieldId.PageRange) ||
                citation.Reference.PageRange == null ||
                string.IsNullOrEmpty(citation.Reference.PageRange.PrettyString)
            )
            {
                //Alles unterdrücken ausser QuotationPageRangeFieldElement
                TransferSettings(pageRangeFieldElement, quotationPageRangeFieldElement);
                RemoveAllButElement(componentPart, quotationPageRangeFieldElement);
                RemoveParenthesesFromPrefixSuffix(quotationPageRangeFieldElement);

                return(null);
            }


            var startPageArticle   = citation.Reference.PageRange.StartPage;
            var startPageQuotation = placeholderCitation.Entry.PageRange.StartPage;

            //[2], [3], [4] [= nur Zitatseiten]
            if (startPageQuotation == startPageArticle)
            {
                //Alles unterdrücken ausser QuotationPageRangeFieldElement - wichtig: Eine der beiden TransferSettings-Zeilen muss immer durch vorangestellte //-Schrägstriche auskommentiert sein!
                //TransferSettings(quotationPageRangeFieldElement, pageRangeFieldElement);	//diese Reihenfolge verwenden, wenn die Präfixe der Zitatseiten-Komponente angezeigt werden sollen
                TransferSettings(pageRangeFieldElement, quotationPageRangeFieldElement);                        //diese Reihenfolge verwenden, wenn die Präfixe der Seitenbereichs-Komponente angezeigt werden sollen
                RemoveAllButElement(componentPart, quotationPageRangeFieldElement);
                RemoveParenthesesFromPrefixSuffix(quotationPageRangeFieldElement);

                return(null);
            }

            //[5], [6], [7] [= Erste Aufsatzseite (Zitatseiten)]
            else
            {
                pageRangeFieldElement.PageOneHasSpecialFormat = false;
                pageRangeFieldElement.PageTwoHasSpecialFormat = false;
                pageRangeFieldElement.PageMultiNumberingStyle = NumberingStyle.StartPageOnly;
                pageRangeFieldElement.PageMultiSuffix.Text    = string.Empty;

                pageRangeFieldElement.ColumnOneHasSpecialFormat = false;
                pageRangeFieldElement.ColumnTwoHasSpecialFormat = false;
                pageRangeFieldElement.ColumnMultiNumberingStyle = NumberingStyle.StartPageOnly;
                pageRangeFieldElement.ColumnMultiSuffix.Text    = string.Empty;

                pageRangeFieldElement.MarginOneHasSpecialFormat = false;
                pageRangeFieldElement.MarginTwoHasSpecialFormat = false;
                pageRangeFieldElement.MarginMultiNumberingStyle = NumberingStyle.StartPageOnly;
                pageRangeFieldElement.MarginMultiSuffix.Text    = string.Empty;

                pageRangeFieldElement.ParagraphOneHasSpecialFormat = false;
                pageRangeFieldElement.ParagraphTwoHasSpecialFormat = false;
                pageRangeFieldElement.ParagraphMultiNumberingStyle = NumberingStyle.StartPageOnly;
                pageRangeFieldElement.ParagraphMultiSuffix.Text    = string.Empty;

                pageRangeFieldElement.OtherOneHasSpecialFormat = false;
                pageRangeFieldElement.OtherTwoHasSpecialFormat = false;
                pageRangeFieldElement.OtherMultiNumberingStyle = NumberingStyle.StartPageOnly;
                pageRangeFieldElement.OtherMultiSuffix.Text    = string.Empty;

                return(null);
            }
        }
        bool TryValidateComponentPartStructure(ComponentPart componentPart, out PageRangeFieldElement pageRangeFieldElement, out QuotationPageRangeFieldElement quotationPageRangeFieldElement)
        {
            /*
             *      Allowed structures:
             *      /1/ [article pages] [quotation pages]
             *      /2/ [article pages] [literal] [quotation pages]
             *      /3/ [article pages] [literal] [quotation pages] [literal]
             */

            pageRangeFieldElement          = null;
            quotationPageRangeFieldElement = null;

            if (componentPart == null)
            {
                return(false);
            }
            if (componentPart.Elements == null ||
                componentPart.Elements.Count == 0 ||
                componentPart.Elements.Count < 2 ||
                componentPart.Elements.Count > 4)
            {
                return(false);
            }

            IElement element01 = componentPart.Elements.ElementAtOrDefault(0);
            IElement element02 = componentPart.Elements.ElementAtOrDefault(1);
            IElement element03 = componentPart.Elements.ElementAtOrDefault(2);
            IElement element04 = componentPart.Elements.ElementAtOrDefault(3);


            #region /1/ [article pages] [quotation pages]
            if (element04 == null &&
                element03 == null &&
                element02 != null &&
                element02 is QuotationPageRangeFieldElement &&
                element01 != null &&
                element01 is PageRangeFieldElement &&
                ((PageRangeFieldElement)element01).PropertyId == ReferencePropertyId.PageRange)
            {
                pageRangeFieldElement          = (PageRangeFieldElement)element01;
                quotationPageRangeFieldElement = (QuotationPageRangeFieldElement)element02;
                return(true);
            }
            #endregion

            #region /2/ [article pages] [literal] [quotation pages]
            if (element04 == null &&
                element03 != null &&
                element03 is QuotationPageRangeFieldElement &&
                element02 != null &&
                element02 is LiteralElement &&
                element01 != null &&
                element01 is PageRangeFieldElement &&
                ((PageRangeFieldElement)element01).PropertyId == ReferencePropertyId.PageRange)
            {
                pageRangeFieldElement          = (PageRangeFieldElement)element01;
                quotationPageRangeFieldElement = (QuotationPageRangeFieldElement)element03;
                return(true);
            }
            #endregion

            #region /3/ [article pages] [literal] [quotation pages] [literal]
            if (element04 != null &&
                element04 is LiteralElement &&
                element03 != null &&
                element03 is QuotationPageRangeFieldElement &&
                element02 != null &&
                element02 is LiteralElement &&
                element01 != null &&
                element01 is PageRangeFieldElement &&
                ((PageRangeFieldElement)element01).PropertyId == ReferencePropertyId.PageRange)
            {
                pageRangeFieldElement          = (PageRangeFieldElement)element01;
                quotationPageRangeFieldElement = (QuotationPageRangeFieldElement)element03;
                return(true);
            }
            #endregion

            return(false);
        }