有没有办法在 _ 之后自动切换到文本模式

有没有办法在 _ 之后自动切换到文本模式

我是一名物理专业的学生,​​我们被告知指数缩写一些描述性的词语或索引只是为了区分比如说两个物体的质量AB 不应该用斜体在方程中。例如$m_\text{tot} = m_\text{A} + m_\text{B}$。对于物理常数或任何非虚构的指数,这些指数应该用斜体作为方程的其余部分。这里的一个例子是电子的质量$m_e$

因为基本上每一个index 是用来表示你编造的东西的,几乎每个索引我都必须写出来_\text{...}。这只会让我的方程式变得非常混乱,以至于我试图找到一种方法来自动在字符后切换到文本模式_,但一无所获。所以我在这里问你们:你知道方法吗?

提前感谢您的回答。

编辑:另请参阅有没有办法让数学模式下标自动变为非斜体?

答案1

您可以使用不同的字符来引入文本下标,这样您就可以继续_完成其通常的工作。

我选择它是?因为它不太可能出现在数学公式中。

\documentclass{article}
\usepackage{amsmath}

\newcommand{\textualsubscript}[1]{%
  _{\textnormal{\upshape#1}}%
}
\begingroup\lccode`~=`? \lowercase{\endgroup\let~}\textualsubscript
\AtBeginDocument{\mathcode`?="8000 }

\begin{document}

$m?{tot}=m?{A}+m?{B}-m_{e}$

\end{document}

在此处输入图片描述

采用稍微不同的方法,我们可以允许嵌套下标(当然?不能出现在这样的地方)。

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\tl_new:N \l__egreg_textualsb_arg_tl

\cs_new_protected:Nn \egreg_textualsb:n
 {
  \tl_set:Nn \l__egreg_textualsb_arg_tl { #1 }
  \tl_replace_all:Nnn \l__egreg_textualsb_arg_tl { ? } { \__egreg_textualsb:n }
  \__egreg_textualsb:V \l__egreg_textualsb_arg_tl
 }
\char_set_active_eq:nN { `? } \egreg_textualsb:n

\cs_new_protected:Nn \__egreg_textualsb:n
 {
  \ensuremath{\sb{\textnormal{\upshape#1}}}%
 }
\cs_generate_variant:Nn \__egreg_textualsb:n { V }

\AtBeginDocument
 {
  \char_set_mathcode:nn { `? } { "8000 }
 }

\ExplSyntaxOff

\begin{document}

$m?{tot}=m?{A?{téxt}}+m?{B}-m_{e}$

\end{document}

在此处输入图片描述

答案2

如果您愿意并且能够使用 LuaLaTeX 编译文档,以下解决方案可能会让您感兴趣。该解决方案定义了一个名为 的 Lua 函数,如果存在,sub2mathrm它将下标项包含在包装器中\mathrm没有空格_在(下划线) 字符和 (a) 括在花括号中的材料(例如,{tot})或 (b) 单个字母字符(例如,A或)之间B。相反,如果有字符后面有一些空格_,Lua 函数不做任何事。Lua 函数对A_\sigma两者都不做任何事,因为 中的反斜杠字符\sigma不是字母字符。在 Lua 强大的(“广义替换”)函数sub2mathrm的帮助下完成其工作。string.gsub

通过执行 (一个分配给 LuaTeX回调\SubToMathrmOn的实用宏)可激活 Lua 函数。通过运行 实用宏可停用该函数。sub2mathrmprocess_input_buffer\SubToMathrmOn

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
  function sub2mathrm ( s )
    s = s:gsub ( "_(%b{})" , "_{\\mathrm%1}" )
    s = s:gsub ( "_(%a)" , "_{\\mathrm{%1}}" )
    return s
  end
\end{luacode}

%% define two utility macros:
\newcommand\SubToMathrmOn{\directlua{luatexbase.add_to_callback ( 
   "process_input_buffer" , sub2mathrm , "sub2mathrm" )}}
\newcommand\SubToMathrmOff{\directlua{luatexbase.remove_from_callback ( 
   "process_input_buffer" , "sub2mathrm" )}}

\begin{document}
\SubToMathrmOn % Activate the Lua function

$m_{tot} = m_A + m_B$     % no whitespace after "_"

$m_ {tot} = m _ A + m_ B$ % whitespace after "_"

\SubToMathrmOff % Deactivate the Lua function

$m_{tot} = m_A + m_B$

\end{document}

相关内容