我正在写一本书,其中包含多个章节,它们通过使用 \ref 相互链接。现在我想了解这些章节\ref
和\pageref
链接的起点和目标。
有没有办法提取一个列表\ref
,\pageref
其中包括它们出现的页码和目标的页码?
数据集可能如下所示:
type, source, target
pageref, 10, 122
ref, 11, 43
最后,数据可以可视化为和弦图因此读者可以得到关于不同部分如何相互关联的另一种表示形式:
此外,最好对所有引用执行相同的操作,以获得有关每个章节/部分/小节的参考文献数量的汇总。
更新 到目前为止,我一直在使用以下文件 * .aux 文件:其中存储了所有 \ref,但没有任何页码 * 后记文件:如果转换为文本,至少某些正则表达式可以收集诸如“参见页面...”之类的片段。将后记处理为人类可读的代码会很有帮助。
答案1
你可以试试参考文献包。不幸的是,它不在 CTAN 上,因为它没有任何文档,只有一个使用示例。
您没有提供任何示例,因此我将添加一些:
\documentclass{article}
\usepackage{lipsum}
\usepackage{rdfref-user,rdfref-query,nameref}
\usepackage{newfile}
\newoutputstream{references}
\openoutputfile{\jobname.ref}{references}
\begin{document}
\inputontology{theorem-ontology.tex}
\section{first}
\rdflabel{sec:first}
Some references, to section~\rdfref{sec:second} on page~\rdfpageref{sec:second}
\lipsum[1-10]
\section{second}
\rdflabel{sec:second}
Now some other references, to section~\rdfref{sec:first} on page~\rdfpageref{sec:first}
\Bind{?ref}{doc:refersTo}{?obj}{%
\addtostream{references}{
\GetValProperty{?ref}{rdf:type}
\GetValProperty{?ref}{doc:pageNo}
\GetValProperty{?obj}{doc:pageNo}
}
}
\end{document}
它使用rdfref
命令、\rdfref
和,如果您想修改默认的 LaTeX 命令来使用功能,\rdfpageref
您\rdflabel
可以使用类似的命令。let\label\rdflabel
rdfref
\inputontology{theorem-ontology.tex}
加载部分和其他一些引用类型对象的默认属性。对象的属性保存在.aux
文件中:
\relax
\LoadTriple {sec:sectioning}{rdfs:label}{Sectioning}
\LoadTriple {sec:sectioning}{rdf:type}{rdfs:Class}
\LoadTriple {thm:theorem}{rdfs:label}{Theorem}
\LoadTriple {thm:theorem}{rdf:type}{rdfs:Class}
\LoadTriple {thm:proposition}{rdfs:label}{Proposition}
\LoadTriple {thm:proposition}{rdf:type}{rdfs:Class}
\LoadTriple {thm:proposition}{rdfs:subClassOf}{thm:theorem}
\LoadTriple {thm:lemma}{rdfs:label}{Lemma}
\LoadTriple {thm:lemma}{rdf:type}{rdfs:Class}
\LoadTriple {thm:lemma}{rdfs:subClassOf}{thm:theorem}
\LoadTriple {eq:equation}{rdfs:label}{Equation}
\LoadTriple {eq:equation}{rdf:type}{rdfs:Class}
\LoadTriple {eq:equation}{rdfs:subClassOf}{thm:theorem}
\LoadTriple {rdfs:Class}{rdfs:label}{Class}
\LoadTriple {sec:first}{doc:hasParent}{\RootObject }
\LoadTriple {sec:first}{doc:envir}{document}
\LoadTriple {sec:first}{rdf:type}{sec:sectioning}
\@writefile{toc}{\contentsline {section}{\numberline {1}first}{1}}
\newlabel{sec:first}{{1}{1}{first}{}{}}
\LoadTriple {sec:first}{doc:pageNo}{1}
\LoadTriple {sec:first}{rdfs:label}{1\ first}
\LoadTriple {sec:first}{doc:label}{1}
\LoadTriple {_:blank1}{doc:hasParent}{sec:first}
\LoadTriple {_:blank1}{doc:pageNo}{1}
\LoadTriple {_:blank1}{doc:refersTo}{sec:second}
\LoadTriple {sec:second}{doc:referedBy}{_:blank1}
\LoadTriple {_:blank1}{rdfs:label}{Blank node: blank1}
\LoadTriple {_:blank1}{rdf:type}{doc:reference}
\LoadTriple {_:blank2}{doc:hasParent}{sec:first}
\LoadTriple {_:blank2}{doc:pageNo}{1}
\LoadTriple {_:blank2}{doc:refersTo}{sec:second}
\LoadTriple {sec:second}{doc:referedBy}{_:blank2}
\LoadTriple {_:blank2}{rdfs:label}{Blank node: blank2}
\LoadTriple {_:blank2}{rdf:type}{doc:pagereference}
\LoadTriple {sec:second}{doc:hasParent}{sec:first}
\LoadTriple {sec:second}{doc:envir}{document}
\LoadTriple {sec:second}{rdf:type}{sec:sectioning}
\@writefile{toc}{\contentsline {section}{\numberline {2}second}{3}}
\newlabel{sec:second}{{2}{3}{second}{}{}}
\LoadTriple {sec:second}{doc:pageNo}{3}
\LoadTriple {sec:second}{rdfs:label}{2\ second}
\LoadTriple {sec:second}{doc:label}{2}
\LoadTriple {_:blank3}{doc:hasParent}{sec:second}
\LoadTriple {_:blank3}{doc:pageNo}{3}
\LoadTriple {_:blank3}{doc:refersTo}{sec:first}
\LoadTriple {sec:first}{doc:referedBy}{_:blank3}
\LoadTriple {_:blank3}{rdfs:label}{Blank node: blank3}
\LoadTriple {_:blank3}{rdf:type}{doc:reference}
\LoadTriple {_:blank4}{doc:hasParent}{sec:second}
\LoadTriple {_:blank4}{doc:pageNo}{3}
\LoadTriple {_:blank4}{doc:refersTo}{sec:first}
\LoadTriple {sec:first}{doc:referedBy}{_:blank4}
\LoadTriple {_:blank4}{rdfs:label}{Blank node: blank4}
\LoadTriple {_:blank4}{rdf:type}{doc:pagereference}
\LoadTriple
有三个参数,第一个是对象,第二个是属性,第三个是值。每个\rdflabel
参数都会生成名为标签的对象并保存一些属性,例如其类型(部分、图形等)或页码。每个\rdfref
参数\rdfpageref
都会生成所谓的空白节点,即匿名对象,具有目标对象、页码等属性。
rdfref
提供检索属性值的查询机制,\Bind
命令:
\Bind{?ref}{doc:refersTo}{?obj}{%
\addtostream{references}{
\GetValProperty{?ref}{rdf:type}
\GetValProperty{?ref}{doc:pageNo}
\GetValProperty{?obj}{doc:pageNo}
}
}
它有四个参数,前三个对应于对象、属性、值模式,第四个是需要执行的代码。以 开头的参数?
是查找的变量。所以在我们的例子中,我们搜索所有具有属性的对象doc:refersTo
,该属性是为所有\rdfref
和\rdfpageref
命令自动创建的。使用\GetValProperty
我们可以检索变量的属性。我们需要获取引用类型(ref 或 pageref)和引用的页面以及引用对象的页码。然后将这些属性保存在名为的文件中texfilename.ref
。在我们的示例中,它的内容为:
doc:reference 1 3
doc:pagereference 1 3
doc:reference 3 1
doc:pagereference 3 1
编辑:
关于引用,我们可以使用biblatex
钩子和数据访问命令。将以下代码保存为biblatex-ontology.tex
:
\AddRdfType{bib}{
\AddPropertyEx{rdf:type}{bib:bibitem}
\AddPropertyEx{doc:pageNo}{\thepage}
\AddPropertyEx{rdfs:label}{Bibitem: \strfield{entrykey}}
}
\WithObject{bib:bibitem}{%
\AddProperty{rdfs:label}{Bibitem}
\AddProperty{rdf:type}{rdfs:Class}
}
\makeatletter
\@ifpackageloaded{biblatex}{%
\AtEveryBibitem{%
\bgroup%
\let\ParentObject\CurrentObject%
\edef\CurrentObject{\strfield{entrykey}}%
% save defalt properties for bib type
\csuse{rdf:type@bib}%
\egroup%
}%
\AtEveryCitekey{%
% use default properties for referencing commands
\rdfref@core{\strfield{entrykey}}{\AddProperty{rdf:type}{bib:citation}}%
}
}{}
\makeatother
重要的命令是\AtEveryBibitem
和,\AtEveryCitekey
它保存有关 bibitem 和引用的信息。
修改后的文档使用了biblatex
我们的新本体:
\documentclass{article}
\usepackage{lipsum}
\usepackage{rdfref-user,rdfref-query,nameref}
\usepackage{newfile}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\newoutputstream{references}
\openoutputfile{\jobname.ref}{references}
\inputontology{theorem-ontology.tex}
\inputontology{biblatex-ontology.tex}
\begin{document}
\section{first}
\rdflabel{sec:first}
Some references, to section~\rdfref{sec:second} on page~\rdfpageref{sec:second}
Some citations: \cite{bertram}
\lipsum[1-10]
\section{second}
\rdflabel{sec:second}
Now some other references, to section~\rdfref{sec:first} on page~\rdfpageref{sec:first}
\Bind{?ref}{doc:refersTo}{?obj}{%
\addtostream{references}{
\GetValProperty{?ref}{rdf:type}
\GetValProperty{?ref}{doc:pageNo}
\GetValProperty{?obj}{doc:pageNo}
}
}
\printbibliography
\end{document}
该.ref
文件现在包含:
doc:reference 1 3
doc:pagereference 1 3
bib:citation 1 3
doc:reference 3 1
doc:pagereference 3 1