Crear un entorno con argumentos opcionales.

Crear un entorno con argumentos opcionales.

Quiero crear entornos con dos argumentos opcionales como ese:

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

Cómo puedo hacer eso ? No encuentro nada en internet para hacer eso.

EDITAR: Estaba pensando en algo como eso:

% 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}

Respuesta1

No está tan claro exactamente lo que quieres, ya que estás usando#1 en tu ejemplo como si se usara dentro del entorno, mientras que esa notación solo se usaría cuandodefiniendoel entorno.

Pero entiendo bien la situación, al menos en tu respuesta a gernot, los cambios que habrá que hacer serán diferentes dependiendo de cada uso del entorno.

A continuación se describe un enfoque. Dentro del entorno se podría utilizar un comando especial con dos alternativas que responda a las opciones configuradas con el entorno. Utiliza el xstringpaquete para analizar la opción y\NewDocumentEnvironment el comando recién agregado al kernel (consulte ladocumentación para el paquete xparsesi es necesario),

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

salida de opciones

Respuesta2

¿Quizás algo como lo siguiente (aunque no estoy seguro de a qué te refieres con #1los usos de muestra de los entornos)?

Para cada letra Xque represente una opción (aquí ay s), defina un comando \OptXque proporcione el valor predeterminado (que se usará si la opción no está seleccionada), así como un comando \setOptXque redefina \OptXlo que debería significar cuando se selecciona la opción. Por ejemplo, las definiciones

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

definir una opción sque haga \Optsexpandir a s; sin la opción, \Optsse expande a nada.

Las opciones son manejadas por \processOptionsun comando que toma una cadena de letras de opción como argumento y llama a los \setOptcomandos correspondientes.

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

ingrese la descripción de la imagen aquí

información relacionada