我正在尝试构建与该exercise
包类似的功能,但exercise
并不能完全实现我想要的功能。
梅威瑟:
\documentclass[10pt]{article}
\newwrite\myfile
\immediate\openout\myfile=\jobname.keys
\newcommand{\answerkey}[1]{\write\myfile{#1}}
\begin{document}
\begin{enumerate}
\item $1 + 1 = $ \answerkey{ XXXX 2}
\begin{enumerate}
\item $1 + 2 = $ \answerkey{ XXXX 3}
\begin{enumerate}
\item $1 + 3 = $ \answerkey{ XXXX 4}
\end{enumerate}
\end{enumerate}
\end{enumerate}
\end{document}
我想要的是一些东西来替换 XXXX,以便写入文件的内容类似于:
1. 2
1.a. 3
1.a.i 4
当我不知道枚举器的深度是多少时,我需要一种自动化的方法来访问枚举器的当前标签,并且不想手动为每个枚举器输入一个唯一的标签/标记(如果有人有一种很好的方法来自动化标签/标记生成,那就行得通)。
欢迎提出建议。
答案1
注意,您需要\immediate\write
并只写当前标签
\documentclass[10pt]{article}
\newwrite\myfile
\immediate\openout\myfile=\jobname.keys
\makeatletter
\newcommand{\answerkey}[1]{\immediate\write\myfile{\@currentlabel #1}}
\makeatother
\begin{document}
\begin{enumerate}
\item $1 + 1 = $ \answerkey{ XXXX 2}
\begin{enumerate}
\item $1 + 2 = $ \answerkey{ XXXX 3}
\begin{enumerate}
\item $1 + 3 = $ \answerkey{ XXXX 4}
\end{enumerate}
\end{enumerate}
\end{enumerate}
\end{document}
生产
1 XXXX 2
1a XXXX 3
1(a)i XXXX 4
\ref
1(a)i与您对其中任何一项使用的格式相同\label
,因此您可以用相同的方式自定义两者。
答案2
已编辑并实际给出答案。
正如我在评论中向克里斯托弗解释的那样,第一级枚举的计数器是enumi
,第二级是enumii
,第三级是enumiii
罗马数字形式。如果尚未调用该级别,则计数器值为0
。一旦调用,它会1
随着每个新的而逐步增加\item
。因此,\ifnum
检查确定每个连续级别是否处于活动状态。如果它处于活动状态,它将附加到\theenum<romannumeral-level>.
,\tmplabel
因为\theenum<romannumeral-level>
包含实际的枚举标签,无论它是阿拉伯语、字母还是罗马字母。如果某个级别处于活动状态,它还会递归检查下一个更深的级别是否处于活动状态。
\documentclass[10pt]{article}
\newwrite\myfile
\immediate\openout\myfile=\jobname.keys
\newcommand{\answerkey}[1]{\answerlabel\immediate\write\myfile{\tmplabel #1}}
\newcounter{enumlevel}
\newcommand\answerlabel{\setcounter{enumlevel}{0}\xdef\tmplabel{}\answerlabelhelp%
\xdef\tmplabel{\tmplabel\space}}
\newcommand\answerlabelhelp{%
\stepcounter{enumlevel}%
\ifnum\value{enum\romannumeral\value{enumlevel}}>0\relax
\xdef\tmplabel{\tmplabel\csname theenum\romannumeral\value{enumlevel}\endcsname.}%
\answerlabelhelp%
\fi
}
\begin{document}
\begin{enumerate}
\item $1 + 1 = $ \answerkey{2}
\begin{enumerate}
\item $1 + 2 = $ \answerkey{3}
\begin{enumerate}
\item $1 + 3 = $ \answerkey{4}
\end{enumerate}
\end{enumerate}
\end{enumerate}
\end{document}
该.keys
文件内容如下
1. 2
1.a. 3
1.a.i. 4
按照要求。