我想自动为所有上标和下标着色。以下这问题是我能够生成所需的结果:
使用下面的例子。
但是,激活“_”对我来说是一个问题,因为我已经在文件名中广泛使用它,这意味着当使用“\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}