单个文档内的交叉引用/链接网络分析

单个文档内的交叉引用/链接网络分析

我正在写一本书,其中包含多个章节,它们通过使用 \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\rdflabelrdfref

\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 

相关内容