提取 LaTex 文档的结构,包括注释

提取 LaTex 文档的结构,包括注释

我喜欢在我的文档的每个段落开头写一个带有标题的“特殊”评论,如下所示:

\section{Introduction}

% 1.0 Visually tracking balls is an interesting problem.  
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

% 1.1 Tracking balls is difficult because of these challenges.  
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

% 2.0 Previous work.  
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah. 

这有助于我保持文档内容结构良好。

我想做的是提取文档的结构:分段命令(即\chapter\section)和每段开头的“特殊”注释。
我想解析 LaTex 源文件(或一组源文件,如果主文件包含其他源文件)并生成一个新文件,该文件仅包含分段命令和“特殊”注释,转换为常规文本(未注释),或者更好的是,转换为项目符号列表。

因此,运行上述代码的解析器生成的输出将是:

\section{Introduction}

\begin{itemize}  
  \item 1.0 Visually tracking balls is an interesting problem.  
  \item 1.1 Tracking balls is difficult because of these challenges.  
  \item 2.0 Previous work.  
\end{itemize}

到目前为止,我得到的最佳解决方案是用字符序列标记特殊注释(即以“%$”开头),然后 grep 查找源文件中出现的“%$”和分段命令。

提前致谢。

答案1

使用任何命令行工具都可以轻松完成此操作,我使用 grep 和 sed(在 Windows 上的 cygwin bash 中),但其他系统也有类似的,或者您可以使用 perl

如果zz.tex是你的原始文件,

命令行

$ grep "\(sub\)*section\|^%" zz.tex | sed -e '/^\\s/ a \\\\begin{itemize}' -e 's/^%/\\item /' -e '$ a \\\\end{itemize}'

输出

\section{Introduction}
\begin{itemize}
\item  1.0 Visually tracking balls is an interesting problem.  
\item  1.1 Tracking balls is difficult because of these challenges.  
\item  2.0 Previous work.  
\end{itemize}

答案2

这里我使用“目录”方法,即我明确地将信息写入辅助文件,然后从那里进行处理。编辑后提出了两种方法:1)“XYZecutive 摘要”包含在原始文档中,2) 摘要是外部文档。

在这两种情况下,我都有自己的 tex 文件,可以在其中反复使用宏\addxyzline{type}{content}将各行添加到 aux 文件中。我还有宏\writexyz,它将读取 .aux 文件并创建 .xyz 文件。它可以出现在源文档之后\begin{document},可以在任何分段发生之前,也可以在所有分段发生之后。

方法 1:在同一文档中进行 XYZecutive 摘要

在这种方法中,宏不仅将\writexyz内容写入 .xyz 文件,还会在第二遍处理该文档,并适当地格式化内容。

执行摘要(包含所有\addxyzline信息)出现在调用时\writexyz。在此 MWE 中,我将其放在目录之后但在文档内容之前。我使用\addtocontents宏定义,以便执行摘要分段不会在目录中重复分段。

\documentclass{article}
\newcommand\addxyzline[2]{\addtocontents {xyz}{\protect \xyzline {#1}{#2}}}
\let\svaddtocontents\addtocontents
\makeatletter
\newcommand\writexyz{%
  \renewcommand\addtocontents[2]{\relax}%
  \clearpage\setcounter{section}{0}\noindent%
  {\Huge\hrulefill XYZecutive Summary\hrulefill\par}%
  \newcommand\xyzline[2]{\expandafter\csname##1\endcsname{##2}}\@starttoc{xyz}%
  \par\noindent\hrulefill\clearpage\setcounter{section}{0}%
  \let\addtocontents\svaddtocontents
}
\makeatother
\begin{document}
\tableofcontents% CAN UNCOMMMENT TO SEE THAT toc WORKS FINE
\writexyz

\section{Introduction}
\addxyzline{section}{Introduction}

\addxyzline{begin}{itemize}
\addxyzline{item}{1.0 Visually tracking balls is an interesting problem.}
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

\addxyzline{item}{1.1 Tracking balls is difficult because of these challenges.}
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

\addxyzline{item}{2.0 Previous work.}
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah.
\addxyzline{end}{itemize}

\end{document}

在此处输入图片描述

方法 2:单独的摘要文件

在这里,我像以前一样创建文档主体,但\writexyz不会将摘要写入同一个文档,而仅仅写入 .xyz 文件。

\documentclass{article}
\newcommand\addxyzline[2]{\addtocontents {xyz}{\protect \xyzline {#1}{#2}}}
\makeatletter
\newcommand\writexyz{\newcommand\xyzline[2]{}\@starttoc{xyz}}
\makeatother
\begin{document}
%\tableofcontents% CAN UNCOMMMENT TO SEE THAT toc WORKS FINE
\section{Introduction}
\addxyzline{section}{Introduction}

\addxyzline{begin}{itemize}
\addxyzline{item}{1.0 Visually tracking balls is an interesting problem.}
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

\addxyzline{item}{1.1 Tracking balls is difficult because of these challenges.}
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

\addxyzline{item}{2.0 Previous work.}
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah.
\addxyzline{end}{itemize}

\writexyz
\end{document}

就屏幕输出而言,编译会产生原始文档的输出,而不考虑内容\addxyzline

在此处输入图片描述

但是,它还会创建一个 .xyz 文件(在本例中为 xyz.xyz,因为我将原始文件命名为 xyz.tex),其中包含以下信息:

\xyzline {section}{Introduction}
\xyzline {begin}{itemize}
\xyzline {item}{1.0 Visually tracking balls is an interesting problem.}
\xyzline {item}{1.1 Tracking balls is difficult because of these challenges.}
\xyzline {item}{2.0 Previous work.}
\xyzline {end}{itemize}

包含我的所有\addxyzline信息。

然后,我有一个非常简单的第二个 tex 文件:

\documentclass{article}
\newcommand\xyzline[2]{\csname#1\endcsname {#2}\par}
\begin{document}
\input{xyz.xyz}% NAME OF .xyz FILE GOES HERE IN THE ARGUMENT
\end{document}

提供 xyz 摘要信息

在此处输入图片描述


后记

可以看出,的第一个参数\addxyzline是任何宏名称的文本。在我的 MWE 中,我使用了“section”、“begin”、“item”和“end”。其他有用的咒语可能包括

\addxyzline{relax}{this is just text added on the same line}
\addxyzline{newline}{this is just text on a new line}

答案3

这是一个使用“目录”方法的 ConTeXt 解决方案。选择一个你不使用的章节标题,然后subsubject使用它来注释你的大纲在主文档中:

\setuphead[subsubject][placehead=empty, before=,after=, incrementnumber=yes]

\starttext

\section{Introduction}

\subsubject{1.0 Visually tracking balls is an interesting problem.}
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

\subsubject{1.1 Tracking balls is difficult because of these challenges.}
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

\subsubject{2.0 Previous work. }
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah. 

\stoptext

在第一行中,placehead=empty告诉 ConTeXt 不要将头部(在本例中为子主题)放置在输出中;incrementnumber=yes需要确保 ToC 条目的编写方式可以通过其他文件访问。

接下来创建一个单独的文件来创建大纲。我假设主文件的名称是test.tex

\starttext
\ctxlua{job.load("test.tuc")}
\placelist[section,subsubject]
          [pagenumber=no, headnumber=no]   
\stoptext

这使

在此处输入图片描述

相关内容