枚举列表内的更新命令时出现问题

枚举列表内的更新命令时出现问题

我在枚举环境内更新命令时遇到问题。

我希望做一些练习,并将每个练习的解决方案附加到名为“解决方案”的预定义宏中。

只要我在 之外进行添加解决方案,它就能正常工作\begin{enumerate} \end{enumerate},但是在该环境内部完成添加解决方案时,向该宏添加解决方案就会失败。

任何帮助都将不胜感激,我一直在互联网上寻找解决方案,但没有成功。非常感谢!

这是最小的工作示例。我尝试了\newcommand以及\def

\documentclass[12pt,a4paper]{report}

\usepackage[french]{babel}
\usepackage{fontspec} 
\usepackage{xunicode}

\newcommand{\solutions}{First}

\newcommand{\addsol}[1]{%
    \expandafter\renewcommand\expandafter\solutions\expandafter{\solutions,#1}%
    }

%\def\solutions{First}
%\def\addsol#1{%
%   \expandafter\def\expandafter\solutions\expandafter{\solutions,#1}%
%   }

\begin{document}

\addsol{Second}

\begin{enumerate}
    \item Lorem Ipsum \addsol{Third}

\end{enumerate}

% Print the contents of solutions

\solutions

\end{document}

在每种情况下我都获得以下输出,这意味着第一次和第二次附加成功,但第三次失败:

  1. 乱数

第一秒

答案1

您需要\gdef,因为环境形成群体。

\documentclass[12pt,a4paper]{report}

\usepackage[french]{babel}
\usepackage{fontspec} 
%\usepackage{xunicode}% <--- not recommended


\newcommand{\addsol}[1]{%
  \ifdefined\solutions
    \expandafter\gdef\expandafter\solutions\expandafter{\solutions,#1}%
  \else
    \gdef\solutions{#1}%
  \fi
}

\begin{document}

\addsol{First}
\addsol{Second}

\begin{enumerate}
    \item Lorem Ipsum \addsol{Third}

\end{enumerate}

% Print the contents of solutions

\solutions

\end{document}

请注意,xunicode几年前曾经推荐过,但现在不再推荐了。

另一方面,使用 有一个更好的方法expl3,它允许以多种方式打印解决方案。该\printsolutions命令有一个可选参数,告诉 TeX 在两个解决方案之间放什么,默认为“逗号空格”。

\documentclass[12pt,a4paper]{report}

\usepackage[french]{babel}
\usepackage{fontspec} 

\ExplSyntaxOn

\seq_new:N \g_ladi_solutions_seq

\NewDocumentCommand{\addsol}{m}
 {
  \seq_gput_right:Nn \g_ladi_solutions_seq { #1 }
 }
\NewDocumentCommand{\printsolutions}{+O{,~}}
 {
  \seq_use:Nn \g_ladi_solutions_seq { #1 }
 }

\ExplSyntaxOff

\begin{document}

\addsol{First}
\addsol{Second}

\begin{enumerate}
    \item Lorem Ipsum \addsol{Third}
\end{enumerate}

% Print the contents of solutions with commas

\section*{Solutions}

\printsolutions

\section*{Solutions}

\printsolutions[\par]

\end{document}

在此处输入图片描述

答案2

LaTeX 的环境是组。如果你以非全局的方式更改组内的内容,则更改后将恢复原来的值\end{enumerate}

您的宏\addsol{...}以非本地方式分配新内容,但您希望以全局方式完成更改,\gdef而不是简单的\def

相关内容