扩展下标和下标功能

扩展下标和下标功能

嗯,我喜欢问题中表达的想法使用 tex 的下标替代语法。但我希望它能以稍微不同的方式发挥作用。

我只想扩展通常的_and ^。怎么做?这样,如果有空格,代码就会从 sup/下标中跳出(请参阅底部的例外情况):

  1. a_11 + b_123ijk + c_k\ell应该与 相同a_{11} + b_{123ijk} + c_{k\ell}
  2. 上标也是一样:m^qwpoeriu等于m^{qwpoeriu}

目前,我在序言中写了这段代码(如果你想写F_\mathrm{max}你可以这样做,这会有所帮助F_|max|),所以解决方案不应该破坏它

\makeatletter
\begingroup\catcode`\_=\active\protected\gdef_{\@ifnextchar|\subtextup\sb}\endgroup
\def\subtextup|#1|{\sb{\mathrm{#1}}} 
\AtBeginDocument{\catcode`\_=12 \mathcode`\_=32768}
\makeatother

为什么?

我通常会在代码中留出空格\biggl( a_b \cdot \cos(x - c) = 1 \times \vec v,而不是\biggl(a_b\cdot\cos(x-c)=1\times\vec v,因为我发现这样更容易阅读。所以这对我来说很容易奏效,因为在很多时候我不需要写{}。当然,有时我仍然需要这样做,即\alpha_k\ell + \alpha_{\ell k} = 1

编辑:a_b_c_d + e还有更多。我对像a_{b_{c_d}} + e(和一样)不是特别感兴趣^,但我认为如果那样也能起作用那就太好了(这意味着空格应该避开所有的下标/上标)。

还有更多的事情,不仅空格应该逃避下标/上标,还有这个:

  • 替代 sup/下标,即: a_b^c + 1 = 0应该像a_{b}^{c} + 1 = 0a^blk_ijk一样工作a^{blk}_{ijk}
  • 数学的结局$a_bcde$应该是这样的$a_{bcde}$
  • 以及一个右括号:\frac{1}{a_ijk}等于\frac{1}{a_{ijk}}

答案1

在此处输入图片描述

我请求@barbarabeeton 的原谅。

我只是给你一个测试,抵制使用它的诱惑......

 \documentclass{article}

\makeatletter
\catcode`\_\active
\catcode`\^\active

\def_{\sb\bgroup\xcollectsub}
\def^{\sp\bgroup\xcollectsub}
\def\xcollectsub{\afterassignment\collectsub\global\let\tmp= }
\def\collectsub{%
\def\next\tmp{\tmp\xcollectsub}%
\ifx\tmp\@sptoken\let\next\egroup\fi
\ifx\tmp$\let\next\egroup\fi
\ifx\tmp\egroup\let\next\egroup\fi
\ifx\tmp\bgroup\def\next{\global\let\tmp}\fi
\next\tmp}


\makeatother

\begin{document}

$\frac{1}{a_ijk}$

    $a_11 + b_123ijk + c_k\ell$

 should be the same as

$ a_{11} + b_{123ijk} + c_{k\ell}$.

    And the same for superscripts:

$ m^qwpoeriu $ equal to $ m^{qwpoeriu}$

$\frac{1}{a_ijk}$ equal to $\frac{1}{a_{ijk}}$.


\end{document}

答案2

(以下答案最初是为了回答这个问题而发布的在 LaTeX 数学模式下使下划线持久(用于长下标)。该查询作为当前查询的重复项关闭后,它被移到这里。)

以下基于 LuaLaTeX 的解决方案假设与上标/下标相关的内容以空格或+-=$符号结尾。它进一步假设上标/下标内容仅由大写和小写字母、数字和逗号组成。即上标/下标中没有+-符号。(当然,下面使用的 Lua 代码可以根据您的需要进行更改。)请注意,该代码也适用于与\sum\int表达式相关的上标和下标。

在此处输入图片描述

\documentclass{article}

\usepackage{luacode}
\begin{luacode}
function do_sub_super_grouping ( s )
   return ( string.gsub ( s , "([_%^])([%w%,]+)([%s%$%-%+%=])", "%1{%2}%3" ) )
end
luatexbase.add_to_callback ( "process_input_buffer" , 
   do_sub_super_grouping , "do_sub_super_grouping" )
\end{luacode}

\begin{document}
$\sum_i,j,k ^100 x_ijk y^ijk+a_12,34 ^56 b^7890- c^u,9,v d_v7,v7$
\end{document} 

相关内容