因此命令如下:
\newcommand{\betahat}{\hat{\beta}}
我怎样才能让 beta 可以被任何内容替换。这样我就可以输入\yhat
然后获取\hat{y}
或任何我可能想要添加的内容。我只是觉得这样做更快更有效率。这是否可行,而无需为每种可能的情况设置大量不同的命令?
如果有关系的话,我正在使用的编辑器是 TexMaker。
答案1
这是一个基于 LuaLaTeX 的解决方案。
假设输入的形式为\<x>hat
。解决方案依赖于以下关于 的工作假设<x>
:
如果
<x>
由一个单身的字母字符,例如\ahat
或\zhat
,则输入将转换为\hat{<x>}
,例如\hat{a}
或\hat{z}
。如果
<x>
由两个或以上字母字符,例如\alphahat
或\Omegahat
,则输入将转换为\hat{\<x>}
,例如\hat{\alpha}
或\hat{\Omega}
。换句话说,假设<x>
是一个缺少反斜杠前缀的宏。\xyhat
这一工作假设的一个直接结果是,不是被转换为\hat{xy}
。相反,它将被转换为\hat{\xy}
-- 可能会导致崩溃,除非恰好被定义为有效宏。我相信这不是一个很大的限制,因为一开始就考虑在-- 或任何其他多字母组合上方放置一个窄重音符号\xy
并没有多大意义。^
xy
如果
<x>
为空或不完全由字母组成,则不执行任何操作。因此,\hat{a}
和\hat{\alpha}
不会被修改。如果您的 LaTeX 文件恰好包含\,hat
,那么它也不会被修改:TeX 将只输出一个细空格 (\,
),后跟字母h
、a
和t
。
解决方案由一个 Lua 函数(称为myhat
)组成,它负责完成所有工作。此函数被分配给回调process_input_buffer
,赋予其预处理器角色:该函数的工作在非常早期的阶段完成,前TeX 会进行任何常规处理。因此,TeX 永远不会“看到”\ahat
和\alphahat
;它只会看到\hat{a}
和\hat{\alpha}
。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
function myhat ( s ) -- this function does all of the work
s = s:gsub ( "\\(%a)hat" , "\\hat{%1}" )
s = s:gsub ( "\\(%a%a-)hat", "\\hat{\\%1}" )
return s
end
\end{luacode}
% Assign 'myhat' to the 'process_input_buffer' callback:
\directlua{luatexbase.add_to_callback("process_input_buffer", myhat, "myhat")}
\begin{document}
$\alphahat, \betahat, \dots, \psihat, \omegahat$;
$\Gammahat, \Deltahat, \dots, \Psihat, \Omegahat$;
$\ahat, \bhat, \dots, \zhat$;
$\Ahat, \Bhat, \dots, \Zhat$.
% Verify that output is the same if standard syntax is used:
$\hat{\alpha}, \hat{\beta}, \dots, \hat{\psi}, \hat{\omega}$;
$\hat{\Gamma}, \hat{\Delta}, \dots, \hat{\Psi}, \hat{\Omega}$;
$\hat{a}, \hat{b}, \dots, \hat{z}$;
$\hat{A}, \hat{B}, \dots, \hat{Z}$.
\end{document}