我正在使用newpx
字体,但我想在文本样式中降低后方\int
(即 之后\nolimits
)的上标,也可能在显示样式中也降低。这可能吗?
\documentclass{article}
\usepackage{newpxmath}
\makeatletter
\AtBeginDocument{
\check@mathfonts
\fontdimen13\textfont2=3.5pt
\fontdimen14\textfont2=3.5pt
\fontdimen16\textfont2=2.5pt
\fontdimen17\textfont2=2.5pt
}
\makeatother
\begin{document}
$\int_A^B x_a x^b x_a^b \,\mathrm{d}x$
\[\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\end{document}
我知道最低限度移位是由字体角控制的,但似乎我无法\int
进一步最小化限制的值(只有增加它才会起作用,但只会影响正常的上标)。
答案1
我不确定这是否会破坏其他东西,但是......我使其^
活跃,如果在数学模式下,我会重新定义它以将参数向下移动,同时保留当前的数学风格。
对于上标
(正如原帖作者所问的)
\documentclass{article}
\usepackage{scalerel,url}
\let\svss^
\catcode`^=\active %
\def^{\ifmmode\expandafter\svss\expandafter\bgroup\expandafter\lowerit\else\svss\fi}
\def\lowerit#1{\ThisStyle{\raisebox{-2\LMpt}{$\SavedStyle#1$}}\egroup}
\usepackage{newpxmath,newpxtext}
\makeatletter
\AtBeginDocument{
\check@mathfonts
\fontdimen13\textfont2=3.5pt
\fontdimen14\textfont2=3.5pt
\fontdimen16\textfont2=2.5pt
\fontdimen17\textfont2=2.5pt
}
\makeatother
\begin{document}
\centering
A\_B \url{A_B} $\int_A^B x_a x^b x_a^b \,\mathrm{d}x$
\[\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\[\scriptstyle\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\[\scriptscriptstyle\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\end{document}
不幸的是,这降低了全部上标,我还没有找到一种方法来限制它的范围,例如\int
。
可以使用如果设置为 true\int
并在使用后设置为 false:
\documentclass{article}
\usepackage{scalerel,url}
\let\svss^
\catcode`^=\active %
\gdef^{\ifmmode\expandafter\svss\expandafter\bgroup\expandafter\lowerit\else\svss\fi}
% if to check wether an \int was preceding or not
\newif\ifAfterInt
\def\lowerit#1{%
% lower superscript only if \int preceeded, then set
% bool to false for all following superscripts until
% the next \int sets it to true.
\ifAfterInt
\global\AfterIntfalse
\ThisStyle{\raisebox{-2.5\LMpt}{$\SavedStyle#1$}}\egroup
\else
#1\egroup
\fi
}
\usepackage{newpxmath,newpxtext}
\makeatletter
\AtBeginDocument{
\check@mathfonts
\fontdimen13\textfont2=3.5pt
\fontdimen14\textfont2=3.5pt
\fontdimen16\textfont2=2.5pt
\fontdimen17\textfont2=2.5pt
}
\makeatother
% redefine \int to set the boolean to true
% (must be done after newpxmath was loaded)
\def\int{
\intop\AfterInttrue\nolimits
}
\begin{document}
\centering
A\_\^B \url{A_^B}
$\int_A^B x_a x^b x_a^b \,\mathrm{d}x$
\[\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\[\int_A^{\text{B}} x_a x^b x_a^b \,\mathrm{d}x\]
\[\scriptstyle\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\[\scriptscriptstyle\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\end{document}
问题
虽然这个解决方案有效,但它存在一些问题:
'
之前不能有素数^
,即V'^2
必须输入为V'{}^2
\text
必须用括号括起来:V^{\text{txt}}
- 您不能再使用
^
in\pgfmathsetmacro
和 linke - 它打破
mhchem
了\ce{^{123}Xx}
下标方法
(原文误读了这个问题)
\documentclass{article}
\usepackage{scalerel,url}
\let\svus_
\catcode`_=\active %
\def_{\ifmmode\expandafter\svus\expandafter\bgroup\expandafter\lowerit\else\svus\fi}
\def\lowerit#1{\ThisStyle{\raisebox{-2\LMpt}{$\SavedStyle#1$}}\egroup}
\usepackage{newpxmath}
\makeatletter
\AtBeginDocument{
\check@mathfonts
\fontdimen13\textfont2=3.5pt
\fontdimen14\textfont2=3.5pt
\fontdimen16\textfont2=2.5pt
\fontdimen17\textfont2=2.5pt
}
\makeatother
\begin{document}
\centering
A\_B \url{A_B} $\int_A^B x_a x^b x_a^b \,\mathrm{d}x$
\[\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\[\scriptstyle\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\[\scriptscriptstyle\int_A^B x_a x^b x_a^b \,\mathrm{d}x\]
\end{document}
不幸的是,这降低了全部下标,我还没有找到一种方法来限制它的范围,例如\int
。这可以按照上面上标所示进行修复。
答案2
这是一个基于 LuaLateX 的解决方案。它对输入材料的格式有两个要求:(a) 积分下限和上限的材料必须用花括号括起来,(b) 积分下限必须位于积分上限之前。(如果任何一个要求不满足,Lua 函数就不会执行其操作。)
积分下限向下移动的量和积分上限向上移动的量分别由宏
\Tstrut
(“顶部支柱”)和\Bstrut
(“底部支柱”)控制。提供了两个 LaTeX 宏,分别称为
\ChangeIntOff
和\ChangeIntOn
,用于关闭和重新打开该功能。默认状态为“开启”。
(据我所知,这些包newpxtext
和newpxmath
LuaLaTeX 配合得不是很好。因此,在下面的代码中,我将其加载TeX Gyre Pagella
为文本字体和TeX Gyre Pagella Math
数学字体。)
下面的截图显示,该解决方案影响内联式积分表达式,但不影响显示式积分表达式。这些线是为了帮助眼睛判断积分极限分别向下和向上移动了多远(当然,如果有的话)。
\documentclass{article}
% Set the dimensions of the top and bottom struts
\newcommand\Tstrut{\rule{0pt}{1.65ex}}
\newcommand\Bstrut{\rule[-0.85ex]{0pt}{0pt}}
\usepackage{fontspec,unicode-math}
\setmainfont{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
%% Lua-side code
\usepackage{luacode}
\begin{luacode}
function change_int ( s )
s = string.gsub ( s , "\\int%s-%_%s-(%b{})%s-^%s-(%b{})",
"\\int_{\\mkern-2mu %1\\Tstrut}^{%2\\Bstrut}")
return s
end
\end{luacode}
%% TeX-side code
\newcommand\ChangeIntOn{\directlua{%
luatexbase.add_to_callback ( "process_input_buffer",
change_int , "change_int" )}}
\newcommand\ChangeIntOff{\directlua{%
luatexbase.remove_from_callback ( "process_input_buffer",
"change_int" )}}
\AtBeginDocument{\ChangeIntOn} % function is on by default
\begin{document}
\hrule
$\int _{A} ^{B} f(x)\,dx$
vs.\
$\int _A ^ {B} f(x)\,dx$ % not affected by Lua function b/c no curly braces around "A"
\hrule
\bigskip
\hrule
$\displaystyle\int _ {A} ^ {B} f(x)\,dx$
vs.\
$\displaystyle\int _ A ^ {B} f(x)\,dx$
\hrule
\end{document}