假设我们有包含不同字符组合的输入字符串,例如:
123ee4978124e340862e7352e442we34ts8034luio29752o93eweqwt27sfs59395239sfe384928%
ai*4et8!sur*ysnvo546wet*ywugh)oeigh*(wahfiwnegi45oehs*klgv'niwu75*3tsjkg;ninuw%
9.368e-03, 0.3846e-045, 238476.9734, 1,00,000.000e+0, -3.8746e+006, 23.0000874%
The enormous elephant was enranged by the sight of his savage captors carrying their ropes%
, axes and huge iron-barred cages.%
我们还假设我们的可选标记是e
。也就是说,我们想e
在任何/所有输入字符串/数字元素中“查找”的每个实例,以便执行一些格式化/替换操作。例如,假设我们想e
用空格替换每个实例!
鉴于这个问题,从给定的输入中搜索这样的可选标记的最有效的基于 TeX / LaTeX 的方法是什么?
注意:在这个问题中,我没有包括用户在“查找”每个可选令牌实例后可能希望或不希望执行的任何其他操作。但是,如果出于演示目的,需要某种搜索后操作,那么这将是一个加分项!
温馨建议:
就 TeX/LaTeX 解析的经验而言,我是一个‘入门级 TeX 用户’,最多如此。因此,请考虑以下几点:
- 该方法应该充分通用的。
- 请提供基于 TeX/LaTeX 的解决方案。基于 LuaTeX/XeTeX 的解决方案并不可取,因为我不想对新语法感到困惑。
- 未来的解决方案必须考虑到‘入门级 TeX/ LaTeX 用户’因此,内嵌注释和简短解释关于代码行为将是最有帮助的!
- 更新:请尽可能提供解决方案不使用任何专用于字符串解析的附加软件包(例如
xstring
)。有关原因,请参阅下面给出的更新。
提前谢谢了! :)
更新:也许我在这里违反了某种规则,因为我在@HeikoOberdiek已经发布了答案,尽管如此,它就在这里。
此次更新并非旨在忽视 @Heiko 的无论如何我都不想回答,因为我理解他建议背后的原因。然而,他建议初学者应该坚持使用这个
xstring
软件包,但对我来说并不适用,因为 -
- 我已经熟悉了
xstring
& 它是\StrSubstitute
宏;和- 作为初学者,我更热衷于向更有经验的用户学习一些基本的 TeX/LaTeX 解析技术,以便提高我的 TeX 能力。
因此,我通过此更新在上述列表中添加了一条额外建议。希望没问题。
答案1
对于“入门级 TeX/LaTeX 用户”,我认为最有效的方法是使用专用包,例如xstring
。此包适用于纯 TeX 和 LaTeX。可以使用宏 进行字符串替换\StrSubstitute
。工作量将是阅读文档。
对于有经验的用户来说,最好的方法很大程度上取决于具体情况:
- 字符串由哪种标记组成?空格和组可能会很棘手。
- 是否需要可扩展的实现,或者是否允许赋值?可扩展的实现有更广泛的用途,但是要以效率和复杂性为代价。
- 字符串的结尾是如何指定的?
- 搜索字符串是什么?一个标记,还是几个标记?
- 结果应该是怎样的?
- ...
有几种方法,它们的实用性取决于答案,例如:
\futurelet
通过检查下一个标记来进行基于解析的分析。这不可扩展,但很高效。O(n) 的运行时复杂度是可能的。通过宏参数文本进行解析。这允许可扩展的实现。但通常不快。带有花括号的组也造成了很多麻烦。
TeX 引擎 pdfTeX 提供
\pdfmatch
,但这不是通用的 TeX。但是,它非常强大,因为支持正则表达式。但字符串被清理为 catcode 为 12(或空格为 10)的字符。l3regex
LaTeX3 项目也支持正则表达式。e
类别代码技巧。用空格替换非常简单:\catcode`\e=10 % category code of space
但它只能在组内使用。否则写起来会有点困难
\end{document}
。活跃的角色也会有所帮助。
...