需要宏来将内容从 LaTeX 以字符串形式写入文件

需要宏来将内容从 LaTeX 以字符串形式写入文件

我们正在编写一个cls文件,该文件会生成一个文本文件,这是运行 latex 的副作用。这将在 docker 容器内的云服务中完成,因此安全是一个严重的问题。输出文件将由 python 处理,最好将文件编码为 UTF-8。这对 施加了严格的限制pdflatex,它似乎只支持非常有限的 etc 输出编码T1(有人知道如果文件编码为 ,如何用 python 读取它吗T1?)。如果可能的话,我想避免luatex因为安全问题而依赖 (这不是这个问题的主题,但它可能会让我们延迟六个月)。我在这方面取得了相当大的进展,但其余的可能需要 latex3 API,而这些 API 的文档相对稀疏。我只能找到相对较少的代码示例来处理 latex3 api 中的令牌列表或字符串。

问题的根源在于,它\write旨在写出标记,但我只想要文本。为了实现这一目标,我将在必要时丢弃标记。如果您尝试,\write{a~b}最终会得到一个标记表示: a\protect \unhbox \voidb@x \protect \penalty \@M \ {}b 这对我们来说是不可接受的 - 我们只想要“a b”(排版代码在 TeX 之外毫无意义)。我愿意接受所有字符都编码为 TeX 字符串(如 {"u})的输出,因为我们可以轻松地用 python 中的 UTF-8 等效项替换它们。()或 $$ 内的内联数学应该保留为文本。基本上我想要的是一个像 \newcommand{\mywrite}[1]{...} 这样的宏,它执行以下操作:

输入 输出到文件中
\mywrite{这是~文本} 这是文本
\mywrite{这有 $a^2$ 个选项} 这有 $a^2$ 个选项
\mywrite{这在 Damgård 中是 UTF-8} 在 Damgård 中使用 UTF-8
或者:这在 Damg{\aa}rd 中有 UTF-8
\mywrite{这在 Damg{\aa}rd 中有 UTF-8 (同上)
\mywrite{这有 {\bf bold}} 这有大胆
\mywrite{这有 \textsl{倾斜的文本} 文字倾斜
\mywrite{这使用 \amacro{text}} 这使用 <expanded from \amacro>
\mywrite{使用一个词\footnote{某事} 使用一个词
\mywrite{使用 \smile} 使用 \smile
或:使用 ⌣
\mywrite{使用 {ACM} 进行发布} 使用 ACM 进行发布
\mywrite{使用``引号''} 使用“引号”
\mywrite{处理换行 换行被视为空格
作为空格}

如果有人这么做\newcommand{\mybold}[1]{bold: {\bf #1}},那么 \mywrite{This has \mybold{a}}应该产生“这有粗体:a”。经验法则是 [Pakin 列表](https://math.uoregon.edu/wp-content/uploads/2014/12/compsymb-1qyb3zd.pdfshould被编码为 UTF-8 或输出中相应的 TeX 宏。任何宏都应扩展为可以识别此类字符的程度。任何内联数学运算都应以字符串形式出现,就像在 TeX 中书​​写的那样,以 () 或 $$ 为界。显示数学运算也可能保留(但我对此不太担心)。任何涉及排版命令(如字体、间距、、\twocolumn\includegraphics)的内容都应立即删除。这旨在用于作者姓名、标题、章节标题和其他元数据等,但不是为了保留排版命令。如果对参数中的宏有疑问,我们会将其删除。

似乎可以通过扫描传递给 的参数中的标记来实现这一点\mywrite,每个标记都有一个 catcode 0-15。具有字符等效项(如 3、7、8、10、11、12、13)的 catcode 应该具有其相应的字符表示。代码应设计为删除没有明显字符串等效项的任何内容。

答案1

我认为标准 LaTeX 命令\text_purify:n可以满足您的大部分需求:

\documentclass{article}

\newwrite\txt
\immediate\openout\txt=\jobname.txt
\ExplSyntaxOn
\cs_new:Npn\mywrite#1{
\immediate\write\txt{\text_purify:n{#1}}
}
\ExplSyntaxOff
\begin{document}


\mywrite{hello world}
\mywrite{Γειά σου Κόσμε}
\mywrite{\textbf{this} \textit{that}}
\mywrite{$\alpha+\sqrt{x\beta^2}$}


\end{document}

生成.txt具有 UTF-8 内容的文件:

hello world
Γειά σου Κόσμε
this that
$\alpha +\sqrt {x\beta ^2}$

相关内容