如何在调用新命令的地方扩展它?

如何在调用新命令的地方扩展它?

我需要收集文档末尾显示的内容,如下所示

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

在此处输入图片描述

相关内容