重新定义 ^ 以生成罗马上标和下标

重新定义 ^ 以生成罗马上标和下标

我需要为书籍出版物自动设置罗马字体的数学公式中的上标和下标。我不想\mathrm{...}分别应用到每个上标和下标。

幸运的是,我找到了一种解决方案,可以在罗马字体样式中全局设置下标重新定义下划线以产生罗马下标。我做了一些改动,以便所有索引都以罗马字体按顺序排列:

\catcode`_=\active
\newcommand_[1]{\ensuremath{\sb{\mathrm{#1}}}}

原始排版$x_{abc}^{de}$原来的

上述代码中的罗马下标$x_{abc}^{de}$罗马下标

但是,我不知道如何将此代码应用于上标。有没有人有解决方案,以便将下标和上标字体样式都设置为罗马字体?

答案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}

使用 altsubsup 包编写代码

括号形式使用 显示\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}

相关内容