我想创建具有两个可选参数的环境,如下所示:
\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}
我该怎么做?我在网上找不到任何可以做到这一点的方法
编辑:我正在考虑类似的事情:
% 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}