Lua - 自动转为 --if 介于两个数字之间

Lua - 自动转为 --if 介于两个数字之间

我反复读到 Lua 可以在 TeX 中做一些很酷的底层操作。有一件事浮现在我的脑海:我有一个相当健忘的同事,他总是在两个数字之间使用连字符而不是短划线,即:0-60而不是0--60。我认为这将是一个很酷的挑战(并且自私地对我的学习有好处),我会问以下问题:

如果 - 位于两个数字之间,是否可以用基于 Lua 的宏(或两个宏)来启用/禁用将 - 更改为 -- ?

答案1

我认为有两种方式可以解释您的请求。

  • 您可能正在寻找一个 LaTeX 宏,它接受一个参数,并在(且仅当)介于两个数字之间时转换-为,如。在下面的代码中,此 LaTeX 宏称为。该宏反过来调用 Lua 函数来执行实际工作。---0-60\DashToEndash2en

  • 您可能正在寻找一种预处理器类型的解决方案,它应该对输入流(部分)起作用TeX 开始正常工作并将 的所有实例转换为[digit]-[digit][digit]--[digit]在下面的代码中,分别通过名为\EndashOn和的 LaTeX 宏启用和禁用此方法\EndashOff\EndashOn将名为 的 Lua 函数分配makeEn给 LuaTeXprocess_input_buffer回调;相反,\EndashOff从回调中删除此 Lua 函数。

  • 请注意,dash2enmakeEn函数仅在“返回”操作结果的方式上有所不同string.gsubdash2en将结果传递给tex.sprint函数,而只是将结果放回到输入流中。(回想一下,当回调执行其工作makeEn时,TeX 的常规处理 —— “眼睛”、“嘴巴”等 —— 尚未激活。process_input_buffer

  • 最后,观察字符串A-Z不是转换为A--Zby\DashToEn或 if\EndashOn已被调用。当然,这正是 OP 的规范所要求的。

在此处输入图片描述

\documentclass{article}
\usepackage{luacode} % for 'luacode' environment

%% Lua-side code
\begin{luacode}
function dash2en ( s )
  s = s:gsub ( "(%d)%-(%d)" , "%1--%2" )
  tex.sprint ( s )
end
function makeEn ( s )
  s = s:gsub ( "(%d)%-(%d)" , "%1--%2" ) 
  return s
end
\end{luacode}

%% LaTeX-side code
\newcommand\DashToEn[1]{\directlua{dash2en("#1")}}
\newcommand\EndashOn{\directlua{luatexbase.add_to_callback (
   "process_input_buffer" , makeEn, "makeEn" )}}
\newcommand\EndashOff{\directlua{luatexbase.remove_from_callback (
   "process_input_buffer" , "makeEn" )}}
  
\begin{document}

0-60 55-65 99-101 A-Z

\DashToEn{0-60 55-65 99-101 A-Z}

\EndashOn
0-60 55-65 99-101 A-Z

\EndashOff
0-60 55-65 99-101 A-Z

\end{document}

相关内容