我在枚举环境内更新命令时遇到问题。
我希望做一些练习,并将每个练习的解决方案附加到名为“解决方案”的预定义宏中。
只要我在 之外进行添加解决方案,它就能正常工作\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
您需要\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
。