我想提取各种乳胶命令的内容,例如
- 部分
- 章节
- 标题
- 旁注等
来自.tex
文件。这些元素最终将出现在 CSV 文件中
chapter, chapter 1 title text
chapter, chapter 2 title text
figure, figure text
这是否需要正则表达式或者这是重新发明轮子?
该.tex
文件是通过 pandoc 从 markdown 文档生成的。
示例 A
\documentclass{report}
\usepackage{hyperref}
\newcommand*\Quux{Pouet}
\begin{document}
\chapter[foo]{Foo}
\url{http://www.tex.org}
\end{document}
我想提取章节和网址。
示例 B
\documentclass{tufte-book}
\begin{document}
\chapter{A chap}
\marginnote{A note}
\end{document}
我想提取边注
答案1
您可以使用类似这样的文件来检测所有分段命令(我们称之为instrumenter.tex
):
\RequirePackage{xparse}
\ExplSyntaxOn
\iow_new:N \l_csgillespie_iow
% #1: sectioning command name as a single token
% #2: character tokens representing the command name, without the backslash
\cs_new_protected:Npn \csgillespie_instrument_sec_cmd:Nn #1#2
{
% Save the original sectioning command
\cs_gset_eq:cN { g_csgillespie_#2_orig: } #1
\RenewDocumentCommand #1 { s O{##3} m }
{
\iow_now:Nn \l_csgillespie_iow { #2 ; ##2 ; ##3 }
\IfBooleanTF {##1}
{ \use:c { g_csgillespie_#2_orig: } * {##3} }
{ \use:c { g_csgillespie_#2_orig: } [##2] {##3} }
}
}
\cs_generate_variant:Nn \csgillespie_instrument_sec_cmd:Nn { c }
% #1: character tokens representing the command name, without the backslash
\cs_new_protected:Npn \csgillespie_instrument_sec_cmd_ifexists:n #1
{
\cs_if_exist:cT {#1}
{ \csgillespie_instrument_sec_cmd:cn {#1} {#1} }
}
\AtBeginDocument
{
\iow_open:Nn \l_csgillespie_iow { sectioning.csv }
\clist_map_inline:nn
{
part, chapter, section, subsection, subsubsection, paragraph,
subparagraph
}
{ \csgillespie_instrument_sec_cmd_ifexists:n {#1} }
}
\AtEndDocument { \iow_close:N \l_csgillespie_iow }
\ExplSyntaxOff
\endinput
然后,假设您要检查一个名为的文件tested.tex
:
\documentclass{report}
\newcommand*\Quux{Pouet}
\begin{document}
\chapter[foo]{Foo}
\chapter{Bar \emph{Baz!}}
\chapter*{\Quux !}
\section{A \emph{section}!}
\section[Short title]{Another section}
\end{document}
您所要做的就是将其放在instrumenter.tex
一个存在的位置TEXINPUTS
(可能是与 相同的目录tested.tex
),然后运行:
latex '\input instrumenter \input tested'
(这里的单引号代表 shell,请根据您的 shell 进行调整)。您将在与此示例sectioning.csv
相同的目录中获得一个名为的文件,如下所示:tested.tex
chapter;foo;Foo
chapter;Bar \emph {Baz!};Bar \emph {Baz!}
chapter;\Quux !;\Quux !
section;A \emph {section}!;A \emph {section}!
section;Short title;Another section
如果某些标题包含分号分隔符 ( ;
),您可能需要在输出中添加双引号(或 CSV 格式所需的任何内容)。只需在以下行中添加它们即可:
\iow_now:Nn \l_csgillespie_iow { #2 ; ##2 ; ##3 }
论点段落
如果您使用此代码包装其他命令,并且这些命令可以在其参数中合法包含标记(例如,空行),则请在相应的参数前面\par
添加,如下所示:+
\RenewDocumentCommand #1 { s +O{##3} +m }
对应O{##3}
于包装命令的可选参数(默认为强制参数的值),对应m
于其强制参数。+
对于标准分段命令来说,应该没有用,但如果您使用此系统记录其他命令的参数,可能会有用。
答案2
提取包可以让你做到这一点:
https://www.ctan.org/tex-archive/macros/latex/contrib/extract
其中的自述文件(extract.pdf)中的文档非常好。