Erstellen einer Umgebung mit optionalen Argumenten

Erstellen einer Umgebung mit optionalen Argumenten

Ich möchte Umgebungen mit zwei optionalen Argumenten wie diesen erstellen:

\begin{myenvir}[]
    Title

    #1
\end{myenvir}

\begin{myenvir}[s]
    Titles

    #1
\end{myenvir}

\begin{myenvir}[a]
    Title (with something)

    #1
\end{myenvir}

\begin{myenvir}[sa]
    Titles (with something)

    #1
\end{myenvir}

Wie kann ich das machen? Ich finde im Internet nichts dazu

EDIT: Ich habe an so etwas gedacht:

% Pseudo-Declaration
\begin{envir}[#1]
    if #1 == a:
        Title (admis) % or admise but it depends of the envir
    elif #1 == s:
        Titles
    else:
        Titles (admis) % or admise
    % And then the text
\end{envir}

Antwort1

Es ist nicht ganz klar, was Sie genau wollen, da Sie in Ihrem Beispiel so verwenden, #1als ob dies innerhalb der Umgebung verwendet würde, während diese Notation nur verwendet würde, wenndefinierendie Umgebung.

Aber ich verstehe die Situation richtig, zumindest was Ihre Antwort an gernot betrifft, werden die erforderlichen Änderungen je nach Nutzung der Umgebung unterschiedlich sein.

Ein Ansatz wird im Folgenden beschrieben. Innerhalb der Umgebung können Sie einen speziellen Befehl mit zwei Alternativen verwenden, der auf die mit der Umgebung festgelegten Optionen reagiert. Er verwendet das xstringPaket zum Parsen der Option und \NewDocumentEnvironmenteinen neu zum Kernel hinzugefügten Befehl (sieheDokumentation für das xparse-Paketwenn nötig),

\documentclass{article}
\usepackage{xstring}% for \IfSubStr command

% set booleans for the options
\newif\ifmysoption
\newif\ifmyaoption

% define commands that respond to the options
\newcommand{\IfAOption}[2]{\ifmyaoption{#1}\else{#2}\fi}
\newcommand{\IfSOption}[2]{\ifmysoption{#1}\else{#2}\fi}

% define environment that sets the values of the booleans
\NewDocumentEnvironment{myenvir}{o}{%
    \IfValueTF{#1}{% check if optional argument exists
        \IfSubStr{#1}{a}% check if it contains an a
            {\myaoptiontrue}% if so, set a option boolean true
            {\myaoptionfalse}% if not, set it false
        \IfSubStr{#1}{s}% check if it contains an s
            {\mysoptiontrue} % if so, set s option boolean true
            {\mysoptionfalse} % if not, set it false
    }{
        % no option given, so both are false
        \mysoptionfalse\myaoptionfalse
    }
}{%
}

\begin{document}

With no option:

\begin{myenvir}
Title\IfSOption{s}{}\IfAOption{ (Something)}{}
\end{myenvir}

\bigskip

With just ``a'':

\begin{myenvir}[a]
Title\IfSOption{s}{}\IfAOption{ (Something)}{}
\end{myenvir}

\bigskip

With just ``s'':

\begin{myenvir}[s]
Title\IfSOption{s}{}\IfAOption{ (Something)}{}
\end{myenvir}

\bigskip

With both:

\begin{myenvir}[sa]
Title\IfSOption{s}{}\IfAOption{ (Something)}{}
\end{myenvir}

\end{document}

Optionen Ausgabe

Antwort2

Vielleicht etwas in der Art des Folgenden (obwohl ich nicht sicher bin, was Sie mit #1den Beispielverwendungen der Umgebungen meinen)?

Definieren Sie für jeden Buchstaben, Xder eine Option darstellt (hier aund s), einen Befehl, \OptXder den Standardwert angibt (der verwendet wird, wenn die Option nicht ausgewählt ist), sowie einen Befehl \setOptX, der \OptXden Wert neu definiert, wenn die Option ausgewählt wird. Beispielsweise die Definitionen

\newcommand\Opts{}% default value
\newcommand\setOpts{\renewcommand\Opts{s}}

Definieren Sie eine Option s, die \Optseine Erweiterung auf bewirkt s; ohne diese Option \Optserfolgt eine Erweiterung auf nichts.

Die Optionen werden dadurch gehandhabt, \processOptionsdass eine Zeichenfolge aus Optionsbuchstaben als Argument verwendet wird und die entsprechenden \setOptBefehle aufgerufen werden.

\documentclass{article}
\newcommand\processOptions[1]{\processOptionsX#1\relax}
\newcommand\processOptionsX[1]{%
  \ifx\relax#1\relax
    \let\tmp\relax
  \else
    \csname setOpt#1\endcsname
    \let\tmp\processOptionsX
  \fi
  \tmp  
}
\newcommand\Opta{}% default value
\newcommand\setOpta{\renewcommand\Opta{ (with something)}}
\newcommand\Opts{}% default value
\newcommand\setOpts{\renewcommand\Opts{s}}
\newenvironment{myenvir}[1][]{%
  \processOptions{#1}%
  \begin{center}
}{%
  \end{center}
}
\begin{document}

\begin{myenvir}
    Title\Opts\Opta
\end{myenvir}
\begin{myenvir}[s]
    Title\Opts\Opta
\end{myenvir}
\begin{myenvir}[a]
    Title\Opts\Opta
\end{myenvir}
\begin{myenvir}[sa]
    Title\Opts\Opta
\end{myenvir}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen