![打造可列出的环境](https://linux22.com/image/340585/%E6%89%93%E9%80%A0%E5%8F%AF%E5%88%97%E5%87%BA%E7%9A%84%E7%8E%AF%E5%A2%83.png)
我正在使用我在收集文档开头列表的内容 修改名称,以便生成问题列表
\documentclass[a4paper,11pt]{book}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\let\originalcontentsline\contentsline
\usepackage{hyperref}
\makeatletter
\newcommand{\printquestions}{%
\section*{Questions}
\begin{enumerate}
\let\contentsline\originalcontentsline
\def\@noitemerr{\@latex@warning{Empty questions list}}%
\@starttoc{qst}
\end{enumerate}
}
\newcommand{\l@qst}[3]{#1}
\makeatother
\NewEnviron{questions}
{%
\addcontentsline{qst}{qst}{%
\noexpand\unexpanded{\unexpanded\expandafter{\BODY}}%
}%
}
\begin{document}
\chapter{one}
\begin{questions}
\item some question
\end{questions}
\chapter{two}
\begin{questions}
\item some other question
\end{questions}
\end{document}
但我想从几个方面进行调整:
目前的代码是,它会获取列表中的项目,将其从其位置移除,并将它们放置在我的
$
\printquestions$
所在的任何位置。我希望它将项目复制到该位置而不移除它们,有点像目录(在本例中为问题)。我希望能够单击收集的项目,以便它将我带到文件中问题的原始位置,这样我就可以稍后添加问题的答案,而不必查看文档。
$
因为理想情况下我会在\begin{questions}... \end{questions}中一次只提出一个问题,$
所以最好以子部分的形式使用$
\question{some question in here}之类的东西,我使用\newcommand{\question}{\subsubsection}来管理它;它实际上解决了上述大部分问题,只要我添加$
$
$
\设置计数器{tocdepth}{3}
\设置计数器{secnumdepth}{3}
在序言中,但它没有将所有问题收集在一起,而是将它们放在其层次结构的目录中,而这违背了不必在文档中费力寻找它们的目的。
因此,基本上我想创建一个命令,允许我以类似“小节”或“定理”的风格插入问题;并且所有这些实例都收集在$
\listofquestions中$
,我可以在文档开头显示它,并且它可以与 hyperref 一起使用。
我也尝试实施基于 列出假设以及对假设的引用
% *************** Question ***************
\newtheorem{questionin}{Question}[chapter]
\newtheorem{questionaux}{Question}[chapter]
\usepackage{environ,etoolbox}
\makeatletter
\def\addtoquestionlist{\addtheoremline{questionaux}}
\NewEnviron{question}{%
\refstepcounter{questionaux}%
\expandafter\addtoquestionlist\expandafter{\expandafter\ignorespaces\BODY}
\begin{questionin}\BODY\end{questionin}
}
\patchcmd\listtheorems
{\begingroup}
{\begingroup\let\label\@gobble}
{}{}
\makeatother
但我不太了解它的工作原理,无法除了名称之外做出适当的更改。
当我使用$
\listtheorems时$
,它会打印 questionaux.1.1 questionin.1.1,
甚至没有标题,这并非我所想的那样。我宁愿它打印问题本身,就像上述两种解决方案一样(使用$\begin{question}
\item \end{question} 的解决方案$
,以及我将其转换为子部分的解决方案)。
答案1
这是一个使用的解决方案埃托克 包裹。
笔记需要保护脆弱的命令。
\documentclass{book}
\usepackage{chngcntr}% counter subsubsection(questions) within chapter
\usepackage{etoc}
\usepackage{hyperref}
\let\question\subsubsection
\counterwithin{subsubsection}{chapter}
\setcounter{secnumdepth}{3}
%\setcounter{tocdepth}{2}
\newcommand{\printquestions}{%
\begingroup
\etocsetlevel{subsubsection}{2}%
\etocsetlevel{part}{3}%
%\etocsetlevel{chapter}{3}%
\etocsetstyle{chapter}{}{}{\addvspace{10pt}}{}
\etocsetlevel{section}{3}%
\etocsetlevel{subsection}{3}%
\etocsetstyle{subsubsection}{}{}
{\noindent\etocnumber\hskip.5em\etocname\hfill\etocpage\par}{}
\etocsettocstyle{\section*{Questions}}{}
\tableofcontents
\endgroup}
\begin{document}
\tableofcontents
\printquestions
\chapter{one}
\section{One foo}
\question{some question}
\chapter{Two}
\section{Two foo}
\question{some other question}
\end{document}
另一种解决方案(无需更改中心)
\documentclass{book}
\usepackage{etoc}
\usepackage{hyperref}
\setcounter{secnumdepth}{3}
\newcounter{question}[chapter]
\renewcommand\thequestion{\thechapter.\arabic{question}}
\makeatletter
\newcommand\question{\@startsection{question}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize}}
\let\questionmark\@gobble
\makeatother
\etocsetlevel{question}{3}%
\newcommand{\printquestions}{%
\begingroup
\etocsetlevel{question}{2}%
\etocsetlevel{part}{3}%
%\etocsetlevel{chapter}{3}%
\etocsetstyle{chapter}{}{}{\addvspace{10pt}}{}
\etocsetlevel{section}{3}%
\etocsetlevel{subsection}{3}%
\etocsetstyle{question}{}{}
{\noindent\etocnumber\hskip.5em\etocname\hfill\etocpage\par}{}
\etocsettocstyle{\section*{Questions}}{}
\tableofcontents
\endgroup}
\begin{document}
\tableofcontents
\printquestions
\chapter{one}
\section{One foo}
\question{some question}
\chapter{Two}
\section{Two foo}
\question{some other question}
\end{document}