Создать среду с необязательными аргументами

Создать среду с необязательными аргументами

Я хочу создать среды с двумя необязательными аргументами, например:

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

Как мне это сделать? Я не нашел ничего в Интернете, чтобы сделать это.

EDIT: Я думал о чем-то подобном:

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

решение1

Не совсем понятно, чего именно вы хотите, поскольку #1в вашем примере это используется так, как будто это будет использоваться внутри среды, тогда как эта нотация будет использоваться только тогда, когдаопределениеокружающая среда.

Но я правильно понимаю ситуацию, по крайней мере, в вашем ответе gernot, изменения, которые необходимо внести, будут разными в зависимости от каждого использования среды.

Итак, один из подходов описан ниже. Внутри среды вы можете использовать специальную команду с двумя альтернативами, которая отвечает на параметры, заданные средой. Она использует пакет xstringдля разбора параметра и \NewDocumentEnvironmentкоманду, недавно добавленную в ядро ​​(см.документация для пакета xparseесли понадобится),

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

параметры вывода

решение2

Может быть, что-то вроде следующего (хотя я не совсем понимаю, что вы имеете в виду под #1примерами использования сред)?

Для каждой буквы X, представляющей опцию (здесь aи s), определите команду \OptX, дающую значение по умолчанию (которое будет использоваться, если опция не выбрана), а также команду \setOptX, которая переопределяет \OptXто, что она должна означать, когда опция выбрана. Например, определения

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

определяет параметр s, который заставляет \Optsрасширяться до s; без параметра \Optsрасширяется до нуля.

Параметры обрабатываются с помощью \processOptionsфункции, которая принимает строку букв параметров в качестве аргумента и вызывает соответствующие \setOptкоманды.

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

введите описание изображения здесь

Связанный контент