将枚举的值写入输出文件

将枚举的值写入输出文件

我想将枚举的当前值保存到输出文件中。使用另一个问题中的信息,我有以下最小示例:

\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

文件的其余部分可以与之前相同。

相关内容