我想将枚举的当前值保存到输出文件中。使用另一个问题中的信息,我有以下最小示例:
\documentclass{article}
\newcommand{\collectSolutions}{\immediate\openout\tempfile=solutions.tex}
\newwrite\tempfile
\newcommand{\solution}[1]{\immediate\write\tempfile{\theenumi\theenumii\theenumiii:\unexpanded{#1}}}
\newcommand{\printSolutions}{%
\immediate\closeout\tempfile
\noindent\input{solutions}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\collectSolutions
\begin{enumerate}
\item Text
\begin{enumerate}
\item Part Q 1 \solution{A}
\item Part Q 1 \solution{B}
\item Part Q 1 \solution{\mbox{$solution$}}
\end{enumerate}
\item Another Q \solution{D}
\end{enumerate}
\printSolutions
\end{document}
输出将最后一个问题列为 2c。我认为这是因为 enumii 计数器直到重新启动此级别才会重置。同样,我如何从 \printSolutions 中获得最终列表中的 1a、1b、1c、2?
答案1
根据深度定义控制序列;可以使用\p@enumi
,\p@enumii
和\p@enumiii
,但结果取决于类;这样,您可以选择自己的表示形式。
关键是宏\@enumctr
记录了当前枚举计数器的名称;因此
\csname sol@\@enumctr\endcsname
我们访问\sol@enumi
,\sol@enumii
或者\sol@enumiii
无需人工干预。调整这些宏的含义以满足您的需要。
\documentclass{article}
\makeatletter
\newwrite\solutions@file
\newcommand{\collectSolutions}{\immediate\openout\solutions@file=\jobname.sol}
\newcommand{\sol@enumi}{\theenumi}
\newcommand{\sol@enumii}{\theenumi.\theenumii}
\newcommand{\sol@enumiii}{\theenumi.\theenumii.\theenumiii}
\newcommand{\solution}[1]{%
\immediate\write\solutions@file{%
\csname sol@\@enumctr\endcsname: \unexpanded{#1}%
}%
}
\newcommand{\printSolutions}{%
\immediate\closeout\solutions@file
\noindent\input{\jobname.sol}
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\collectSolutions
\begin{enumerate}
\item Text
\begin{enumerate}
\item Part Q 1 \solution{A}
\item Part Q 1 \solution{B}
\item Part Q 1 \solution{C}
\end{enumerate}
\item Another Q \solution{D}
\end{enumerate}
\printSolutions
\end{document}
这是“解决方案”文件的内容:
1.a: A
1.b: B
1.c: C
2: D
我不太喜欢给输出文件指定“固定”名称,以免破坏现有文件。使用建议的宏,输出文件将与主 LaTeX 文件同名,但扩展名为.sol
。
如果您想添加在.sol
文件中添加写入的格式化说明,那么有两种方法。
第一种方法
\newcommand{\sol@enumi}{\noexpand\textbf{\theenumi}}
\textbf
在写入操作发生时不会扩展。每个“不安全”宏都应以\noexpand
(not )开头\theenumi
,我们想并立即扩大)。
第二种方法
定义\protected@immediatewrite
类似于的宏\protected@write
:
\makeatletter
\newwrite\solutions@file
\newcommand{\collectSolutions}{\immediate\openout\solutions@file=\jobname.sol}
\newcommand{\sol@enumi}{\textbf{\theenumi}}
\newcommand{\sol@enumii}{\theenumi.\theenumii}
\newcommand{\sol@enumiii}{\theenumi.\theenumii.\theenumiii}
\newcommand{\protected@immediatewrite}[3]{%
\begingroup
\let\thepage\relax
#2% additional settings
\let\protect\@unexpandable@protect
\edef\reserved@a{\immediate\write#1{#3}}\reserved@a
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi
}
\newcommand{\solution}[1]{%
\protected@immediatewrite\solutions@file{}{\csname sol@\@enumctr\endcsname: \unexpanded{\unexpanded{#1}}}}
\newcommand{\printSolutions}{%
\immediate\closeout\solutions@file
\noindent\input{\jobname.sol}
}
\makeatother
文件的其余部分可以与之前相同。