我反复读到 Lua 可以在 TeX 中做一些很酷的底层操作。有一件事浮现在我的脑海:我有一个相当健忘的同事,他总是在两个数字之间使用连字符而不是短划线,即:0-60
而不是0--60
。我认为这将是一个很酷的挑战(并且自私地对我的学习有好处),我会问以下问题:
如果 - 位于两个数字之间,是否可以用基于 Lua 的宏(或两个宏)来启用/禁用将 - 更改为 -- ?
答案1
我认为有两种方式可以解释您的请求。
您可能正在寻找一个 LaTeX 宏,它接受一个参数,并在(且仅当)介于两个数字之间时转换
-
为,如。在下面的代码中,此 LaTeX 宏称为。该宏反过来调用 Lua 函数来执行实际工作。--
-
0-60
\DashToEn
dash2en
您可能正在寻找一种预处理器类型的解决方案,它应该对输入流(部分)起作用前TeX 开始正常工作并将 的所有实例转换为
[digit]-[digit]
。[digit]--[digit]
在下面的代码中,分别通过名为\EndashOn
和的 LaTeX 宏启用和禁用此方法\EndashOff
。\EndashOn
将名为 的 Lua 函数分配makeEn
给 LuaTeXprocess_input_buffer
回调;相反,\EndashOff
从回调中删除此 Lua 函数。请注意,
dash2en
和makeEn
函数仅在“返回”操作结果的方式上有所不同string.gsub
:dash2en
将结果传递给tex.sprint
函数,而只是将结果放回到输入流中。(回想一下,当回调执行其工作makeEn
时,TeX 的常规处理 —— “眼睛”、“嘴巴”等 —— 尚未激活。process_input_buffer
最后,观察字符串
A-Z
是不是转换为A--Z
by\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}