如何从自定义环境命令中插入值

如何从自定义环境命令中插入值

在学习如何使用自定义环境时,我想尝试执行以下操作。这是我的设置:

\newenvironment{myenv}{
  \let\mycaption\myns@mycaption

  \begin{figure}[!h]
  \caption{???whatgoeshere???}
  \end{figure}
}{}

???whatgoeshere???块中,我想插入的值\mycaption。例如,它的用法如下:

\begin{myenv}
  \mycaption{Hello world}
\end{myenv}

问题是,你如何将其插入\caption{...}。例如:

\newenvironment{myenv}{
  \let\mycaption\myns@mycaption

  \begin{figure}[!h]
  \if @mycaption is filled out
  \caption{@mycaption}
  \fi
  \end{figure}
}{}

更新

基本上,我希望获取环境内使用的任何命令的内容,并将其放置在newenvironment命令内的某个位置。因此

\newenvironment{myexample}{
  \let\a\...
  \let\b\...
  \let\c\...

  % place the first `a` here, if it was used in the environment
  \a:first

  % place all of the b's here
  \b:all

  % place all of the c's here
  \c:all

  % place the rest of the a's here
  \a:n+1
}{}

它的用法如下:

\begin{myexample}
  \a{My first item}
  \a{My second item}
  \a{My third item...}
  \b{Foo}
  \c{1}
  \b{Bar}
  \c{2}
  \c{3...}
\end{myexample}

但输出(由于\newenvironment定义)将是:

My first item
Foo
Bar
1
2
3...
My second item
My third item...

想知道如何实现这种行为。这样,用法的运算符myexample不关心操作的顺序,你只需将\a \b等放在任意位置即可。然后\newenvironment代码会将它们放在适当的位置。

甚至不确定如何开始将值放在不同的位置。一旦理解了这一点,那么弄清楚将第一个/第 n 个放在任何地方的细节就应该很简单了。

答案1

这是一个起点(此网站不是为我提供服务),请参阅手册etoolbox了解详情。在这里我甚至没有使用环境(memoir类无关紧要,它只是我的编辑器中的默认类)

\documentclass{memoir}
\usepackage{etoolbox}
\newtoggle{first}
\toggletrue{first}

\newcommand\aaaList{}
\newcommand\aaa[1]{\listadd\aaaList{#1}}

\newcommand\typesetAitem[1]{
  #1\par
  \iftoggle{first}{
    do something after first item
    \togglefalse{first}
  }{}
  \par
}
\newcommand\typesetA{\forlistloop\typesetAitem\aaaList}

\begin{document}

\aaa{Test 1}
\aaa{Test 2}
\aaa{Test 3}

\typesetA

\end{document}

相关内容