![需要宏来将内容从 LaTeX 以字符串形式写入文件](https://linux22.com/image/454133/%E9%9C%80%E8%A6%81%E5%AE%8F%E6%9D%A5%E5%B0%86%E5%86%85%E5%AE%B9%E4%BB%8E%20LaTeX%20%E4%BB%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%BD%A2%E5%BC%8F%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6.png)
我们正在编写一个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}$