按出现顺序编制一份单独的正文中“未解决的问题”列表

按出现顺序编制一份单独的正文中“未解决的问题”列表

我正在写数学笔记。段落中可能包含(或作为单独的段落)一个“开放式问题”。

这是一段关于某个主题的论述。开放式问题:为什么这是事实?

开放式问题:我不明白为什么 bla 是 bleah。这是因为这个还是因为那个?

有没有办法可以像\openQuestion下面这样使用命令?

这是一段关于某个主题的观点的段落。\openQuestion{为什么这是事实?}

\openQuestion{我不明白为什么 bla 是 bleah。这是因为这个还是因为那个?}

我尤其希望有以下功能:

  1. 所有问题按出现的顺序列在某处(可能是在目录之后)
  2. 列表中的每个条目都有提出问题的页码
  3. 页码可点击(移动到引用的页面)
  4. \openQuestion 命令的参数也会出现在调用该命令的最终布局中,就像命令范围之外的普通文本一样。

现在我尝试这样做imakeidx

\documentclass[11pt,a4paper]{book}
\usepackage{imakeidx}
\makeindex[name=firstIndexName,title=Title of the First Index,intoc,columns=1]
\usepackage{hyperref}

\begin{document}
\mainmatter
This is a paragraph making some points about a topic. Why is this true?\index[firstIndexName]{Why is this true?}

I don't understand why bla is bleah. Is this due to this or to that?\index[firstIndexName]{I don't understand why bla is bleah. Is this due to this or to that?}

\backmatter
\printindex[firstIndexName]

\end{document}

输出(相关部分)

未解决问题列表的输出

不幸的是,我无法实现(参见上面的编号列表):

  1. “...按出现顺序”。相反,条目是按字母顺序排列的。
  2. 我必须把这个问题写两次,一次作为 \index 的参数,一次在 \index 之外。

答案1

可以使用我的参考文献包用于此类任务。它使我们能够定义具有属性的对象,然后可以使用简单的查询语言检索这些对象。Rdfref不在 CTAN 上,因此您必须手动安装它。我也从未写过文档,但您可以看到其他使用示例这里或者这里

我创建了一个简单的包,,openquestion.sty它包含两个命令\openQuestion\listQuestions\openQuestion定义新对象,设置对象类型、文本和页码等属性,定义超目标并打印问题。\listQuestions使用简单查询机制处理所有问题并打印问题文本以及页码链接。

\ProvidesPackage{openquestion}
\RequirePackage{rdfref-user}
\RequirePackage{rdfref-query}
\RequirePackage{hyperref}

\newcommand\openQuestion[1]{%
  % define a new object, with anonymous name
  \BlankNode%
  % set basic object properties
  \AddProperty{rdf:type}{oq:question}%
  \AddProperty{oq:text}{#1}%
  \AddPropertyEx{doc:pageNo}{\thepage}%
  % define target for hyperlink, using the current object
  % name as label
  \hypertarget{\CurrentObject}{#1}%
}

\newcommand\listQuestions{%
  \enumerate%
  % process all objects with rdf:type oq:question
  \Bind{?obj}{rdf:type}{oq:question}{
    \edef\currobject{\GetVal{?obj}}% define current object for simpler access
  \item% make enumerate item
    \GetProperty{\currobject}{oq:text}\dotfill% print the question
    % print the page number with link to the page
  \hyperlink{\currobject}{\GetProperty{\currobject}{doc:pageNo}}}%
  \endenumerate%
}


\endinput

最有趣的部分是\Bind命令。它可以查询对象及其属性。它有四个参数,前三个用于搜索对象、属性和值,第四个参数包含针对每个匹配值执行的代码。可以使用 分配变量?varname,然后可以使用\GetVal{?varname}第四个参数访问其值。在此示例中,我们搜索所有属性rdf:type等于 的对象oq:question,它是在命令中分配的\openQuestion。然后将对象名称保存在宏中,以便于访问和更快地处理。然后使用命令\currentobject检索页码和文本。\GetProperty

示例文件:

\documentclass[11pt,a4paper]{book}
\usepackage{openquestion}
\usepackage{lipsum}

\begin{document}

\listQuestions

\lipsum

This is a paragraph making some points about a topic. Why is this true?\openQuestion{Why is this true?}

\lipsum[2-10]

I don't understand why bla is bleah. Is this due to this or to that?\openQuestion{I don't understand why bla is bleah. Is this due to this or to that?}


\end{document}

结果:

在此处输入图片描述

相关内容