假设我们要写一篇文章。第三方要求我们以文本文件形式提交摘要。
我可以自动将 LaTeX 文档的摘要导出到文本文件吗?理想情况下,在导出之前先展开缩写或其他 LaTeX 宏。
示例代码:
\documentclass{article}
\usepackage{siunitx}
\usepackage[acronym, toc, nonumberlist]{glossaries}
\title{Title of Document}
\author{Name of Author}
\newcommand{\texttest}{TEST}
\newacronym{BLSTM}{BLSTM}{bidirectional long short term memory network}
\begin{document}
\maketitle
\begin{abstract}
This is an abstract \texttest~with interesting abbreviations like \gls{BLSTM} and other macros like $\SI{15}{\second}$.
\end{abstract}
\end{document}
预期输出:
This is an abstract TEST with interesting abbreviations like bidirectional long short term memory network (BLSTM) and other macros like 15 s.
答案1
您必须维护\abstractdefs
包含特殊定义的宏,以便扩展到所需的输出。下面的示例显示了您需要插入的内容,\abstractdefs
以实现上述示例。此外,还有一个\stipdollars
宏可以从输出中删除美元。
\documentclass{article}
\usepackage{siunitx}
\usepackage{environ}
\usepackage[acronym, toc, nonumberlist]{glossaries}
\title{Title of Document}
\author{Name of Author}
\newwrite\absfile
\NewEnviron{Abstract}{
\immediate\openout\absfile=\jobname.abs
\begingroup
\def\tmp{}\abstractdefs
\expandafter\stripdollars\BODY$\relax
\immediate\write\absfile{\tmp}%
\endgroup
\abstract\BODY\endabstract
}
\long\def\stripdollars#1${\edef\tmp{\tmp#1}\stripdollarsA}
\def\stripdollarsA{\futurelet\next\stripdollarsB}
\def\stripdollarsB{\ifx\next\relax\else \expandafter\stripdollars\fi}
\def\abstractdefs{
\def~{ }
\def\gls##1{##1}
\def\SI##1##2{##1 ##2}
\def\second{s}
\def\par{^^J}
\def\TeX{TeX}
}
\newcommand{\texttest}{TEST}
\newacronym{BLSTM}{BLSTM}{bidirectional long short term memory network}
\begin{document}
\maketitle
\begin{Abstract}
This is an abstract \texttest~with interesting abbreviations like \gls{BLSTM}
\end{Abstract}
\end{document}
答案2
我不知道有哪个包可以做到这一点,并且将摘要中的所有命令扩展为纯文本可能是不可能的,因为 latex 不是设计用来将命令转换为纯文本的。
这是一个解决方案,它将摘要写入文件,扩展“它能做什么”。它使用环境包来定义一个新的Abstract
环境和新文件包将摘要写入文件并在某种意义上“扩展”摘要。使用环境,Abstract
摘要会像在 PDF 文件中一样正常显示,并且摘要的部分扩展版本会被写入\jobname.abs
(即,带有扩展名的 LaTeX 文件的名称)abs
。对于原始文件中的摘要,这将生成以下abs
文件:
这是一个抽象的 TEST\nobreakspace {},其中包含有趣的缩写,如 \gls {BLSTM} 和其他宏,如 $\SI {15}{\second }$。
因此,已经进行了一些扩展,但原语(如与和命令\nobreakspace
一起出现在输出中)是有代价的。我不知道如何做得更好。\gls
\SI
完整代码如下:
\documentclass{article}
\usepackage{siunitx}
\usepackage{environ}
\usepackage{newfile}
\usepackage[acronym, toc, nonumberlist]{glossaries}
\title{Title of Document}
\author{Name of Author}
\newoutputstream{abstract}% define a new output file stream
\NewEnviron{Abstract}{
\openoutputfile{\jobname.abs}{abstract}% open the abs file
\addtostream{abstract}{\BODY}% write the abstract=\BODY to the file
\closeoutputstream{abstract}% close the file
\abstract\BODY\endabstract% add the abstract to the PDF file
}
\newcommand{\texttest}{TEST}
\newacronym{BLSTM}{BLSTM}{bidirectional long short term memory network}
\begin{document}
\maketitle
\begin{Abstract}
This is an abstract \texttest~with interesting abbreviations like \gls{BLSTM} and other macros like $\SI{15}{\second}$.
\end{Abstract}
\end{document}