我正在尝试构建一个命令,该命令会自动重新定义给定的带星号和不带星号版本的环境。目标是\setenviron{foo}
重新定义环境foo
和foo*
。我尝试使用来自将 s(星号)参数与 \NewDocumentEnvironment 结合使用使用星型参数,但我无法在那里使用环境变量名(用 替换foo
不起作用#1
,即使在我尝试用 代替 并用 扩展它之后也是如此\csname #1* \endcsname
)\foo*
。\expandafter
我该怎么办?
我不知道它是如何\cs_new
工作\cs_new_eq
的,而且我在网上也找不到任何指南(expl3
CTAN 上的文档没有涵盖这些内容),所以我很感激能对解决方案提供一些解释。
梅威瑟:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\newenvironment{foo}{}{}
\ExplSyntaxOn
\NewDocumentCommand{\setenviron}{m}{%
\RenewDocumentEnvironment{#1}{s +b}{%
\IfBooleanTF{##1}{do~~ star~ things\par ##2}{##2}%
}{%
\IfBooleanTF{##1}{\par stop~ doing~ star~ things}{}%
}
\cs_new:cpn {#1*} {\foo*} %I have problem with these two lines
\cs_new_eq:cN { end#1*} \endfoo %
}
\ExplSyntaxOff
\begin{document}
\setenviron{foo}
\begin{foo}
normal foo
\end{foo}
\begin{foo*}
starred foo
\end{foo*}
\end{document}
答案1
一个环境称为 foo*
与名为 的环境没有什么不同(除了惯例)fooX
,并且都不意味着该环境是加星号的。
一个名为的环境的foo*
声明方式与你声明的方式完全一样foo
:
\NewDocumentEnvironment{foo*}{+b}
{Starred: [##1]}
{** starred end}%
并将其用于:
\begin{foo*}
<content>
\end{foo*}
foo
接受可选参数的环境*
则完全不同。你可以将其声明为foo
带s
参数的环境:
\NewDocumentEnvironment{foo}{s +b}
{\IfBooleanTF{#1}{Starred:}{Not starred:} (#2)}
{env end}%
你会使用它(*
注意后环境开始):
\begin{foo}*
<content>
\end{foo}
就您而言,您只希望您的命令定义两个环境,一个称为#1
,另一个称为#1*
:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\newenvironment{foo}{}{}
\newenvironment{foo*}{}{}
\NewDocumentCommand{\setenviron}{m}{%
\RenewDocumentEnvironment{#1}{+b}
{Non starred: (##1)}
{-- no star end}%
\RenewDocumentEnvironment{#1*}{+b}
{Starred: [##1]}
{** starred end}%
}
\begin{document}
\setenviron{foo}
\begin{foo}
normal foo
\end{foo}
\begin{foo*}
starred foo
\end{foo*}
\end{document}