![如何在调用新命令的地方扩展它?](https://linux22.com/image/450514/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%B0%83%E7%94%A8%E6%96%B0%E5%91%BD%E4%BB%A4%E7%9A%84%E5%9C%B0%E6%96%B9%E6%89%A9%E5%B1%95%E5%AE%83%EF%BC%9F.png)
我需要收集文档末尾显示的内容,如下所示
\documentclass{article}
\usepackage{collect}
\definecollection{somethings}
\newcommand{\collectthing}[1]{
There is a #1 here!
\begin{collect}{somethings}{}{}{}{}
\noindent #1 collected in section \arabic{section}
\end{collect}
}
\begin{document}
\section{Section A}
\collectthing{ThingA}
\section{Section B}
\collectthing{ThingB}
\section*{Things collected}
\includecollection{somethings}
\end{document}
\collectthing
但是,由于仅当我调用命令时才会扩展命令\includecollection
,因此所有部分在扩展时都显示它们共享的相同值,如下面的结果所示
我该如何修复它,以便它在最后显示正确的部分编号?
答案1
您存储的是\arabic{section}
,而不是当前值。
解决方案:
\documentclass{article}
\usepackage{collect}
\definecollection{somethings}
\newcommand{\collectthing}[1]{%
There is a #1 here!%
\expandandcollect{somethings}{\noindent #1 collected in section~\arabic{section}}%
}
\ExplSyntaxOn
\NewDocumentCommand{\expandandcollect}{mm}
{
\text_expand:n { \begin{collect}{#1}{}{}#2\end{collect} }
}
\ExplSyntaxOff
\begin{document}
\section{Section A}
\collectthing{ThingA}
\section{Section B}
\collectthing{ThingB}
\section*{Things collected}
\includecollection{somethings}
\end{document}
请注意,对于脆弱的命令,这并不安全,因此您需要\protect
在它们前面。创建的文件将包含
\noindent ThingA collected in section~1
\noindent ThingB collected in section~2
没有expl3
,但不太令人满意:
\makeatletter
\newcommand{\expandandcollect}[2]{%
\begingroup\protected@edef\x{\endgroup
\noexpand\begin{collect}{#1}{}{}#2\noexpand\end{collect}%
}\x
}
\makeatother
答案2
如果你不介意的话expl3
:
\documentclass{article}
\usepackage{xparse} % In case you are using LaTeX version older than 2021
\usepackage{collect}
\definecollection{somethings}
\ExplSyntaxOn
\newcommand{\collectthing}[1]{
There ~ is ~ a ~ #1 ~ here!
\exp_args:Nx \bmello_collectthing_internal:nn { \arabic{section} } { #1 }
}
\cs_new_protected:Nn \bmello_collectthing_internal:nn
{
\begin{collect}{somethings}{}{}{}{}
\noindent #2 ~ collected ~ in ~ section ~ #1
\end{collect}
}
\ExplSyntaxOff
\begin{document}
\section{Section A}
\collectthing{ThingA}
\section{Section B}
\collectthing{ThingB}
\section*{Things collected}
\includecollection{somethings}
\end{document}
\bmello_collectthing_internal:nn
定义了一个内部命令,并通过使用x
-type 参数(\exp_args:Nx
更改\bmello_collectthing_internal:nn
为\bmello_collectthing_internal:xn
)\arabic{section}
在传递给该命令之前进行扩展。
答案3
如果你不希望形成的标记#1
被扩大,你可以做这样的事情:
\documentclass{article}
\usepackage{collect}
\definecollection{somethings}
\newcommand\exchange[2]{#2#1}
\newcommand{\collectthing}[1]{%
There is a #1 here!
\expandafter\exchange\expandafter{%
\number\arabic{section}%
}{%
\begin{collect}{somethings}{}{}{}{}%
\noindent #1 collected in section~%
}%
\end{collect}%
}
\begin{document}
\section{Section A}
\collectthing{ThingA}
\section{Section B}
\collectthing{ThingB}
\section*{Things collected}
\includecollection{somethings}
\end{document}