我想使用 lua 处理整个 tex 文件内容并进行字符串替换。以下是条件
- F、G、H应分别替换为P、Q、R。
- 但是如果它们后面没有 a、e、i、o、u,则分别用 Px、Qx、Rx 替换它们。
- 但是如果它们后面跟着字母 Y,那么就用 S、T、U 替换它们。
所以有 3 个条件。如果 tex 文件是
\documentclass{article}
\begin{document}
FGH\\
FaGaHeF\\
FYGYHY
\end{document}
然后它应该输出到
PxQxRx
PQRPx
STU
如何编写 lua 代码来实现这一点?
答案1
您对替换规则的描述不太清楚。我将其解释如下:
如果字母
F
、G
和H
后面跟着一个小写元音(即 之一aeiou
),则大写-小写字母对应分别替换为P
、Q
和R
。如果字母
F
、G
和H
后面跟着大写字母Y
,则它们(包括字母Y
)应分别替换为S
、T
和U
。如果情况 1 和情况 2 都不适用,则字母
F
、G
和H
应分别替换为Px
、Qx
和Rx
。文件中的所有其他材料应不是会受到前三条替换规则的影响。
只要文档主体不包含名称包含字母F
、G
和/或 的宏或环境H
,您就可以简单地“打开”Lua 函数(更准确地说,将其分配给 LuaTeX 的process_input_buffer
回调,使该函数像输入流上的预处理器一样运行),方法是\fghOn
在 之后运行\begin{document}
。然后它将继续运行,直到到达\end{document}
。可以通过 关闭 Lua 函数\fghOff
。如果您需要一次只对一个字符串执行替换,则可以使用宏\fghSub
- 参见以下工作示例最后一行中的用法。
\documentclass{article}
\usepackage{luacode} % for '\luaexec' and '\luastringN' macros
\luaexec{ % set up Lua function called 'fhg_sub':
function fgh_sub ( s )
s = s:gsub ( "F[aeiou]" , "P")
s = s:gsub ( "G[aeiou]" , "Q")
s = s:gsub ( "H[aeiou]" , "R")
s = s:gsub ( "FY" , "S" )
s = s:gsub ( "GY" , "T" )
s = s:gsub ( "HY" , "U" )
s = s:gsub ( "F" , "Px" )
s = s:gsub ( "G" , "Qx" )
s = s:gsub ( "H" , "Rx" )
return s
end
}
%% Three LaTeX macros to interface with the Lua function:
\newcommand\fghOn{\directlua{luatexbase.add_to_callback(
"process_input_buffer", fgh_sub, "fgh_sub" )}}
\newcommand\fghOff{\directlua{luatexbase.remove_from_callback(
"process_input_buffer", "fgh_sub" )}}
\newcommand\fghSub[1]{\directlua{tex.sprint(fgh_sub(\luastringN{#1}))}}
\begin{document}
\obeylines % just for this example
\fghOn % assign 'fgy_sub' Lua function to preprocessor stack
FGH
FaGaHeF
FYGYHY
\fghOff % remove Lua function from preprocessor stack
Figure, Garage, Hotel
\fghSub{Figure, Garage, Hotel} % run the function on a one-off basis
\end{document}