
Я хочу создать среды с двумя необязательными аргументами, например:
\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}