我希望在每个部分的开头列出我的自定义环境。我读到这个帖子,但无法让 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.prb1
和foo.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}
这个对我有用。