例子

例子

我想自动为所有上标和下标着色。以下问题是我能够生成所需的结果:

在此处输入图片描述 在此处输入图片描述

使用下面的例子。

但是,激活“_”对我来说是一个问题,因为我已经在文件名中广泛使用它,这意味着当使用“\input”和“\includegraphics”时,这个解决方案通常会失败。

有什么方法可以让我每次 LaTeX 进入数学模式时激活字符?

例子

LaTeX 文件(简单使用排版pdflatex

\documentclass{minimal}
\usepackage[active,tightpage,textmath]{preview}
\setlength\PreviewBorder{5pt}%
\usepackage{xcolor}

\newcommand{\amat}{\mathbf{A}}
\newcommand{\bmat}{\mathbf{B}}
\newcommand{\cmat}{\mathbf{C}}

\begin{document}

\(
  \cmat_{i}^{k} = \amat^{i}_{j} \bmat^{j}_{k}
\)

\catcode`_=\active
\catcode`^=\active
\newcommand_[1]{\ensuremath{\sb{\begingroup\color{magenta}#1\endgroup}}}
\newcommand^[1]{\ensuremath{\sp{\begingroup\color{cyan}#1\endgroup}}}

\(
  \cmat_{i}^{k} = \amat^{i}_{j} \bmat^{j}_{k}
\)

\end{document}

答案1

您正在寻找“数学活跃”代码:

\documentclass{article}
\usepackage{color}

\newcommand{\amat}{\mathbf{A}}
\newcommand{\bmat}{\mathbf{B}}
\newcommand{\cmat}{\mathbf{C}}

\begingroup
  \catcode`_=\active
  \catcode`^=\active
  \gdef_#1{\sb{\begingroup\color{magenta}#1\endgroup}}
  \gdef^#1{\sp{\begingroup\color{cyan}#1\endgroup}}
\endgroup
\mathcode`\^="8000 %
\mathcode`\_="8000 %
\catcode`\^=12 %
\catcode`\_=12 %

\begin{document}

Some ^_ text.

\(
  \cmat_{i}^{k} = \amat^{i}_{j} \bmat^{j}_{k}
\)

\end{document}

这与数学模式下任何带有数学代码“8000”的字符一样,都被视为活动字符。因此,即使在文本模式下它们没有执行任何特殊操作,活动时的行为的全局定义也适用_^

答案2

这是一个基于 LuaLaTeX 的解决方案。主要输入语法要求是:(a) 下标和上标术语始终包含在花括号中,(b)_和的参数^紧跟在这些字符之后,即不允许中间有空格。还假设如果_^出现在数学模式之外,例如在 URL 字符串中,则这些字符后面不会紧跟左花括号。

该解决方案不修改 和 的 catcode _^而是由一个 Lua 函数(使用 Lua 强大的string.gsub功能执行实际的着色工作)和两个名为\sbspcolorsOn和的 LaTeX 宏\sbspcolorsOff(用于激活和停用此 Lua 函数的操作)组成。

在此处输入图片描述

\documentclass{article}
\usepackage{luacode,xcolor}
%% The Lua function 'sbspcolors' does most of the work:
\begin{luacode}
function sbspcolors ( s )
  s = string.gsub ( s , "%_(%b{})" , "_{\\textcolor{magenta}%1}" )
  s = string.gsub ( s , "%^(%b{})" , "^{\\textcolor{cyan}%1}" )
  return ( s )
end
\end{luacode}

%% Two helper macros to activate and deactivate the Lua function:
\newcommand{\sbspcolorsOn}{\directlua{luatexbase.add_to_callback(
   "process_input_buffer" , sbspcolors , "sbspcolors" )}}
\newcommand{\sbspcolorsOff}{\directlua{luatexbase.remove_from_callback(
   "process_input_buffer" , "sbspcolors" )}}

%% A few math-mode macros
\newcommand{\amat}{\mathbf{A}}
\newcommand{\bmat}{\mathbf{B}}
\newcommand{\cmat}{\mathbf{C}}

\begin{document}
$\cmat_{i_{u}}^{k^{\ell}} = \sum_{j=1}^{k} \amat^{i}_{j^{M}} \bmat^{j_{N}}_{k}$ \quad
\sbspcolorsOn  % activate the Lua function
$\cmat_{i_{u}}^{k^{\ell}} = \sum_{j=1}^{k} \amat^{i}_{j^{M}} \bmat^{j_{N}}_{k}$ \quad 
\sbspcolorsOff % deactivate the Lua function
$\cmat_{i_{u}}^{k^{\ell}} = \sum_{j=1}^{k} \amat^{i}_{j^{M}} \bmat^{j_{N}}_{k}$
\end{document} 

相关内容