\NewDocumentEnvironment 中带有变量名称的星号参数

\NewDocumentEnvironment 中带有变量名称的星号参数

我正在尝试构建一个命令,该命令会自动重新定义给定的带星号和不带星号版本的环境。目标是\setenviron{foo}重新定义环境foofoo*。我尝试使用来自将 s(星号)参数与 \NewDocumentEnvironment 结合使用使用星型参数,但我无法在那里使用环境变量名(用 替换foo不起作用#1,即使在我尝试用 代替 并用 扩展它之后也是如此\csname #1* \endcsname\foo*\expandafter我该怎么办?

我不知道它是如何\cs_new工作\cs_new_eq的,而且我在网上也找不到任何指南(expl3CTAN 上的文档没有涵盖这些内容),所以我很感激能对解决方案提供一些解释。

梅威瑟:

\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接受可选参数的环境*则完全不同。你可以将其声明为foos参数的环境:

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

在此处输入图片描述

相关内容