我需要为书籍出版物自动设置罗马字体的数学公式中的上标和下标。我不想\mathrm{...}
分别应用到每个上标和下标。
幸运的是,我找到了一种解决方案,可以在罗马字体样式中全局设置下标重新定义下划线以产生罗马下标。我做了一些改动,以便所有索引都以罗马字体按顺序排列:
\catcode`_=\active
\newcommand_[1]{\ensuremath{\sb{\mathrm{#1}}}}
但是,我不知道如何将此代码应用于上标。有没有人有解决方案,以便将下标和上标字体样式都设置为罗马字体?
答案1
我不明白这其中有什么道理,不过事实是这样的:
\documentclass{article}
\newcommand{\upsub}[1]{\sb{\mathrm{#1}}}
\newcommand{\upsup}[1]{\sp{\mathrm{#1}}}
\begingroup\lccode`~=`_\lowercase{\endgroup\let~\upsub}
\begingroup\lccode`~=`^\lowercase{\endgroup\let~\upsup}
\AtBeginDocument{%
\catcode`_=12 \catcode`^=12
\mathcode`_="8000
\mathcode`^="8000
}
\begin{document}
$x_{abc}^{de}$
\end{document}
答案2
我写了包替代子目录将 egreg 给出的解决方案实现为_
和的括号形式^
。参见:
\documentclass{article}
\usepackage{altsubsup}
\begin{document}
$ x_[roman]^{italic} \quad x_{italic}^[roman] \quad
x_[roman]^[roman] \quad x_{italic}^{italic} $
\end{document}
括号形式使用 显示\text
,但可以自定义。
答案3
_
这是一个基于 LuaLaTeX 的解决方案。它不会更改和的 catcode ^
。相反,它会设置一个 Lua 函数并将其分配给process_input_buffer
回调;这样,_{...}
和的所有实例^{...}
都会分别转换为_{\mathrm{...}}
和^{\mathrm{...}}
,前LaTeX 甚至开始其常规处理。
_
/^
和花括号内的内容之间的空格是可以的。但是,花括号的存在很重要:Lua 函数将不是y^x
修改和的外观x_n
,比如说。
% !TeX program = lualatex
\documentclass{article}
\usepackage{amsmath,luacode}
\begin{luacode}
function make_roman ( s )
s = string.gsub ( s , "_%s-(%b{})", "_{\\mathrm%1}" )
s = string.gsub ( s , "%^%s-(%b{})", "^{\\mathrm%1}" )
return s
end
\end{luacode}
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
"process_input_buffer", make_roman , "make_roman" )}}
\begin{document}
$x_{abc}^ {de}$
\end{document}