我正在写数学笔记。段落中可能包含(或作为单独的段落)一个“开放式问题”。
这是一段关于某个主题的论述。开放式问题:为什么这是事实?
开放式问题:我不明白为什么 bla 是 bleah。这是因为这个还是因为那个?
有没有办法可以像\openQuestion
下面这样使用命令?
这是一段关于某个主题的观点的段落。\openQuestion{为什么这是事实?}
\openQuestion{我不明白为什么 bla 是 bleah。这是因为这个还是因为那个?}
我尤其希望有以下功能:
- 所有问题按出现的顺序列在某处(可能是在目录之后)
- 列表中的每个条目都有提出问题的页码
- 页码可点击(移动到引用的页面)
- \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}
输出(相关部分)
不幸的是,我无法实现(参见上面的编号列表):
- “...按出现顺序”。相反,条目是按字母顺序排列的。
- 我必须把这个问题写两次,一次作为 \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}
结果: