
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, #1
als 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 xstring
Paket zum Parsen der Option und \NewDocumentEnvironment
einen 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}
Antwort2
Vielleicht etwas in der Art des Folgenden (obwohl ich nicht sicher bin, was Sie mit #1
den Beispielverwendungen der Umgebungen meinen)?
Definieren Sie für jeden Buchstaben, X
der eine Option darstellt (hier a
und s
), einen Befehl, \OptX
der den Standardwert angibt (der verwendet wird, wenn die Option nicht ausgewählt ist), sowie einen Befehl \setOptX
, der \OptX
den 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 \Opts
eine Erweiterung auf bewirkt s
; ohne diese Option \Opts
erfolgt eine Erweiterung auf nichts.
Die Optionen werden dadurch gehandhabt, \processOptions
dass eine Zeichenfolge aus Optionsbuchstaben als Argument verwendet wird und die entsprechenden \setOpt
Befehle 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}