
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 xstring
paquete 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}
Respuesta2
¿Quizás algo como lo siguiente (aunque no estoy seguro de a qué te refieres con #1
los usos de muestra de los entornos)?
Para cada letra X
que represente una opción (aquí a
y s
), defina un comando \OptX
que proporcione el valor predeterminado (que se usará si la opción no está seleccionada), así como un comando \setOptX
que redefina \OptX
lo 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 s
que haga \Opts
expandir a s
; sin la opción, \Opts
se expande a nada.
Las opciones son manejadas por \processOptions
un comando que toma una cadena de letras de opción como argumento y llama a los \setOpt
comandos 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}