自定义环境列表(每个部分)

自定义环境列表(每个部分)

我希望在每个部分的开头列出我的自定义环境。我读到这个帖子,但无法让 titletoc 帮助我。给定的响应适用于浮动,但我看不出如何使其适应(非浮动)环境。

这是我目前拥有的 MWE;它按照我想要的方式工作,除了逗号之间的间距问题。它遵循上述帖子中的讨论,为每个部分创建一个文件(从 ntheorem 包中破解)。

所以,我的问题是:我该如何解决逗号之间的间距问题?创建大量辅助文件(.prb1、.prb2 等)是否不好?我是不是又重新发明了轮子?我也欢迎任何其他反馈。

\documentclass{article}
\usepackage{ifthen}

\newcounter{probfilecounter}
\setcounter{probfilecounter}{0}
\newcounter{index}
\newcounter{linecount}
\newread\File

\let\stdsection\section
\renewcommand\section{\stepcounter{probfilecounter}\stdsection}

\makeatletter

\def\listproblems{%
\openin\File=\jobname.prb\thesection%
%\@input{\jobname .prb\thesection}%
\setcounter{linecount}{0}%
\loop\unless\ifeof\File%
\stepcounter{linecount}%
\read\File to\fileline %
\repeat%
\closein\File%
% re-open the file
\setcounter{index}{0}%
\openin\File=\jobname.prb\thesection%
\loop\unless\ifeof\File%
\stepcounter{index}% 
\read\File to\fileline%
%\fileline
    \ifthenelse{\theindex=1}%
    {Problems in this section: \fileline}%
    {%
    \ifthenelse{\theindex<\thelinecount}%
    {, \fileline}%
    {}%
    }%
\repeat%
\closein\File%
}%

\def\prb@enablelistofproblems{%
\begingroup%
\makeatletter%
\if@filesw%
\setcounter{index}{0}%
\whiledo{\value{index}<\theprobfilecounter}{%
\stepcounter{index}% 
\expandafter\newwrite\csname tf@prb\theindex\endcsname%
\immediate\openout \csname tf@prb\theindex\endcsname \jobname.prb\theindex\relax%
 }%
\fi%
\@nobreakfalse%
\endgroup}%

\AtEndDocument{\prb@enablelistofproblems}

\makeatother

% define the problem environment
\newcounter{problem}
\newenvironment{problem}{
    \refstepcounter{problem}%
    \textbf{Problem \theproblem} \par
    \addtocontents{prb\theprobfilecounter}{\theproblem}
}{}

\begin{document}

\section{intro}
\listproblems

\begin{problem}
 second problem
\end{problem}

\begin{problem}
 another problem
\end{problem}

\section{another section}
\listproblems

\begin{problem}
 another problem
\end{problem}

\begin{problem}
 another problem
\end{problem}

\end{document}

答案1

看来你的.prb<number>文件中的行尾被 TeX 翻译成了空格。如果我修改代码行

    {, \fileline}%

    {\unskip, \fileline}%

逗号前的空格消失。

答案2

我尝试过你的方法,但遇到了两个问题。一个是它与使用\include\includeonly分割文档并一次只编译部分内容并不真正兼容。如果你有第 1 节和第 2 节在不同的文件中,并且有问题文件foo.prb1foo.prb2,然后排除第一节的文件,你还需要告诉第二节(现在是读取的第一节)查看文件foo.prb2。或类似的东西。我最终在错误的部分中得到了列表。

另一件事是 TeX 对一次可以打开的文件数量有限制。我相信这个数字是 16。因此,除非您关闭每个文件,否则.prb<n>您很快就会用完(我的文档有 15 个章节和近 100 个部分)。

以下是我如何适应的Leo 对相关问题的回答我的文档和您的示例:

\documentclass{article}
\usepackage{titletoc}


\newcounter{problem}
\newenvironment{problem}{
    \refstepcounter{problem}%
    \noindent\textbf{Problem \theproblem} \par
    \addcontentsline{prb}{subsection}{Problem \theproblem}
}{}

\makeatletter%\begin{hack}
\def\ttl@partialprb{ppr}
\def\ttl@writepartial#1#2{%
  \ttl@topartial{toc}{#1}{#2}%
  \ttl@topartial{lof}{#1}{#2}%
  \ttl@topartial{lot}{#1}{#2}%
  \ttl@topartial{prb}{#1}{#2}%
  \ttl@writefile{#1}{#2}}
\makeatother%\end{hack}


\newcommand{\listproblems}{
  \startlist{prb}%
  \printlist{prb}{}{\subsection*{Problems in this section}}}

\begin{document}

\section{intro}
\listproblems

\begin{problem}
 first problem
\end{problem}


\begin{problem}
 second problem
\end{problem}

\begin{problem}
 another problem
\end{problem}

\section{another section}
\listproblems

\begin{problem}
 another problem
\end{problem}

\begin{problem}
 another problem
\end{problem}

\end{document}

这个对我有用。

相关内容