LuaLaTeX 中的条件字符串替换

LuaLaTeX 中的条件字符串替换

我想使用 lua 处理整个 tex 文件内容并进行字符串替换。以下是条件

  1. F、G、H应分别替换为P、Q、R。
  2. 但是如果它们后面没有 a、e、i、o、u,则分别用 Px、Qx、Rx 替换它们。
  3. 但是如果它们后面跟着字母 Y,那么就用 S、T、U 替换它们。

所以有 3 个条件。如果 tex 文件是

\documentclass{article}
 \begin{document} 
    FGH\\
    FaGaHeF\\
    FYGYHY
    \end{document} 

然后它应该输出到

PxQxRx
PQRPx
STU

如何编写 lua 代码来实现这一点?

答案1

您对替换规则的描述不太清楚。我将其解释如下:

  1. 如果字母FGH后面跟着一个小写元音(即 之一aeiou),则大写-小写字母对应分别替换为PQR

  2. 如果字母FGH后面跟着大写字母Y,则它们(包括字母Y)应分别替换为STU

  3. 如果情况 1 和情况 2 都不适用,则字母FGH应分别替换为PxQxRx

  4. 文件中的所有其他材料应不是会受到前三条替换规则的影响。

只要文档主体不包含名称包含字母FG和/或 的宏或环境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}

相关内容