在学习如何使用自定义环境时,我想尝试执行以下操作。这是我的设置:
\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}