我有一个名为的宏\addsol
,将给定练习的解决方案附加到固定的\solutions
宏,以便在文档末尾列出练习的解决方案。
我希望为其添加一个自动机制,以便每个解决方案前面都有enumerate
块中的标签。
理想情况下,如果存在一些指令来模仿枚举列表中使用的标签,无论是 A、B、C 还是 1) 2) 3),而无需针对每种情况重新配置命令,那就太好了。由于这对我来说似乎很难获得,我尝试使用计数器enumi
,如下面的 MWE 所示,但输出没有给出每个问题的编号,而是给出了最终值enumi
。
如有任何建议,我们将非常感激。
\documentclass[12pt,a4paper]{report}
\usepackage[french]{babel}
\usepackage{fontspec}
\usepackage[shortlabels]{enumitem}
\usepackage{amsmath}
\newcommand{\equal}{=}
\newcommand{\addsol}[1]{%
\ifdefined\solutions
\expandafter\gdef\expandafter\solutions\expandafter{\solutions,\ $\Alph{enumi}\equal$ #1}%
\else
\gdef\solutions{\textbf{Solutions:} $\Alph{enumi}\equal$ #1}%
\fi
}
\begin{document}
\begin{enumerate}[label=$\Alph*\equal$]
\item $3 + 5$ \addsol{$8$}
\item $4 \times 6$ \addsol{$24$}
\item $54 \div 9$ \addsol{$6$}
\end{enumerate}
% Print the contents of solutions
\solutions
\end{document}
以下是前面示例的输出:
答案1
您的任务可以通过 TeX 原语轻松解决:
\documentclass[12pt,a4paper]{report}
\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\eaddto#1#2{\expandafter\addto\expanded{\noexpand#1{#2}}}
\newcount\exenum
\def\excercises{\exenum=`A \def\solutions{\par {\bf Solutions:} }}
\def\exe#1#2{\par $\char\exenum=#1$
\addto\solutions{\sol{#2}}\eaddto\solutions{{\the\exenum}}
\global\advance\exenum by1
}
\def\sol#1#2{\ifnum#2=`A \else, \fi$\char#2=#1$}
\def\solutions{\par Solutions:}
\begin{document}
\excercises
\exe{3 + 5}{8}
\exe{4 \times 6}{24}
\exe{54 \div 9}{6}
% Print the contents of solutions
\solutions
\end{document}
结果和 egreg 的答案所示相同。
答案2
您不需要enumerate
,但是itemize
,您需要自己的计数器和更简单的输入语法。
\documentclass[12pt,a4paper]{report}
\usepackage{enumitem}
\usepackage{amsmath}
\makeatletter
\newcommand{\addsol}[1]{%
\ifdefined\solutions
\xdef\solutions{%
\unexpanded\expandafter{\solutions},
\ $\Alph{exe}=#1$%
}%
\else
\xdef\solutions{\unexpanded{\textbf{Solutions:} }$\Alph{exe}=#1$}%
\fi
}
\newcounter{exe}
\newenvironment{exercises}
{%
\begin{itemize}[label=]
\setcounter{exe}{0}%
\global\let\solutions\undefined
}
{\end{itemize}}
\newcommand{\exe}[2]{% #1 = exercise, #2 = solution
\item\stepcounter{exe}$\Alph{exe}=#1$\addsol{#2}%
}
\begin{document}
\begin{exercises}
\exe{3 + 5}{8}
\exe{4 \times 6}{24}
\exe{54 \div 9}{6}
\end{exercises}
% Print the contents of solutions
\solutions
\end{document}
实现expl3
\documentclass[12pt,a4paper]{report}
\usepackage{enumitem}
\usepackage{amsmath}
\ExplSyntaxOn
\newcounter{exe}
\seq_new:N \g_ladi_solutions_seq
\NewDocumentEnvironment{exercises}{}
{
\begin{itemize}[label=]
\setcounter{exe}{0}
\seq_gclear:N \g_ladi_solutions_seq
}
{\end{itemize}}
\NewDocumentCommand{\exe}{mm}
{
\item\stepcounter{exe}$\Alph{exe}=#1$
\seq_gput_right:Ne \g_ladi_solutions_seq { $\Alph{exe}=#2$ }
}
\NewDocumentCommand{\solutions}{}
{
\par\textbf{Solutions:~}
\seq_use:Nn \g_ladi_solutions_seq { ,~ }
}
\ExplSyntaxOff
\begin{document}
\begin{exercises}
\exe{3 + 5}{8}
\exe{4 \times 6}{24}
\exe{54 \div 9}{6}
\end{exercises}
% Print the contents of solutions
\solutions
\end{document}
答案3
我认为可以使用 LaTeX3 解决这个问题。这是我的想法,\addsol
你可以将数据放入一个序列,然后通过 弹出数据\solutions
。
\documentclass{article}
\usepackage[shortlabels,inline]{enumitem}
\ExplSyntaxOn
\seq_new:N \l_solutions_seq
\tl_new:N \l_answer_tl
\NewDocumentCommand{ \addsol }{ m }{ \seq_gput_right:Nn \l_solutions_seq {#1} }
\NewDocumentCommand{\solutions}{ }
{ \textbf{Solutions:}\c_space_tl
\begin{enumerate}[resume*,start=1]
\bool_do_until:nn
{ \seq_if_empty_p:N \l_solutions_seq }
{ \seq_gpop_left:NN \l_solutions_seq \l_answer_tl \item $\l_answer_tl$ }
\end{enumerate}
}
\ExplSyntaxOff
\newcommand{\equal}{=}
\begin{document}
\begin{enumerate}[label=$\Alph*\equal$]
\item $3 + 5$ \addsol{8}
\item $4 \times 6$ \addsol{24}
\item $54 \div 9$ \addsol{6}
\end{enumerate}
\solutions
\end{document}