获取枚举列表中每一项的标签

获取枚举列表中每一项的标签

我有一个名为的宏\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}

在此处输入图片描述 但是,enumerate10/14 行中的环境不能被替换为enumerate*since ,否则会引发错误。

相关内容