Umgebung mit durch Kommas getrennten optionalen Argumenten

Umgebung mit durch Kommas getrennten optionalen Argumenten

xparseWie bringt man so etwas mithilfe zum Laufen ?

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn

\NewDocumentEnvironment{ anenvironment }{ >{\SplitArgument{1}{,}}o }{
  \begin{ auxanenvironment }[#1]
}{
  \end{ auxanenvironment }
}

\NewDocumentEnvironment{ auxanenvironment }{ O{}o }{
  Do~something~with~#1\IfValueTF{ #2 }{ ,~and~something~else~with~#2. }{ . }
}{}

\ExplSyntaxOff
\begin{document}
\begin{anenvironment}[this argument, this other argument]
\end{anenvironment}

\begin{anenvironment}[this argument]
\end{anenvironment}
\end{document}

Antwort1

Obwohl es mit einer Hilfsumgebung möglich ist, glaube ich nicht, dass das die beste Vorgehensweise ist.

Sie sollten sich auch mit dem Fall befassen, wenn das optionale Argument nicht angezeigt wird: Es ist optional, oder?

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentEnvironment{anenvironment}{ >{\SplitArgument{1}{,}}o }
 {
  \IfValueT{#1}{ \noibe_anenvironment_arg:nn #1 }
  %<initial code for the environment>
  \par Start\par
 }
 {
  %<final code for the environment>
  End\par
 }

\cs_new_protected:Nn \noibe_anenvironment_arg:nn
 {
  \tl_if_novalue:nF { #1 }
   {
    Do~something~with~#1
    \tl_if_novalue:nTF { #2 }
     {.}
     {
      ,~and~something~else~with~#2.
     }
   }
}

\ExplSyntaxOff

\begin{document}

\begin{anenvironment}[this argument, this other argument]
\end{anenvironment}

\medskip

\begin{anenvironment}[this argument]
\end{anenvironment}

\medskip

\begin{anenvironment}
\end{anenvironment}

\end{document}

Bildbeschreibung hier eingeben

Ohne Ihren tatsächlichen Anwendungsfall zu kennen, ist es schwierig, weniger allgemein zu sein. Ich schlage vor, dass Sie eine Schlüssel-Wert-Schnittstelle in Betracht ziehen, wenn das Argument zum Festlegen von Optionen dient.

Antwort2

Ein völlig anderer Ansatz.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{listofitems}
\newenvironment{anenvironment}[1][\relax]{%
  \ifx\relax#1\relax\else
    \readlist*\arglist{ #1}%
    \foreachitem\x\in\arglist[]{%
      Doing something with \detokenize\expandafter{\x}.\x\par
    }%
  \fi\par
}{%
  \par Done doing something.\par\medskip
}
\begin{document}
\begin{anenvironment}
This is a test.
\end{anenvironment}
\begin{anenvironment}[\itshape]
This is a test.
\end{anenvironment}
\begin{anenvironment}[\itshape,\bfseries, \tiny]
This is a test.
\end{anenvironment}
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Ich bin nicht sicher, ob das die richtige Vorgehensweise ist, habe aber gerade herausgefunden, dass auxanenvironmentdas Problem gelöst wird, indem man die eckigen Klammern um das Argument in Zeile 6 entfernt und die Argumente in obligatorisch ändert:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn

\NewDocumentEnvironment{ anenvironment }{ >{\SplitArgument{1}{,}}o }{
  \begin{ auxanenvironment }#1
}{
  \end{ auxanenvironment }
}

\NewDocumentEnvironment{ auxanenvironment }{ mm }{
  Do~something~with~#1\IfValueTF{ #2 }{ ,~and~something~else~with~#2. }{ . }
}{}

\ExplSyntaxOff
\begin{document}
\begin{anenvironment}[this argument, this other argument]
\end{anenvironment}

\begin{anenvironment}[this argument]
\end{anenvironment}
\end{document}

verwandte Informationen