我正在使用 CAS 系统自动生成的 Latex 代码。它使用\mathrm{ln}
和{\mathrm e}
。
问题在于,与\mathrm
使用 no 相比,这个字母与它前面的字母之间的间距较大。在以下情况下,空格会丢失:\mathrm{ln}
以下是一个例子
\documentclass[12pt]{book}
\usepackage{amsmath}
\usepackage{mleftright}
\mleftright
\begin{document}
\[
4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)
\]
\[
4 e^{3 x}+3 \ln\left(x \right)
\]
\end{document}
使用 lualatex 编译,得到
我更喜欢第二种。前面的空间\mathrm e
没有改变。但是前面的空间\mathrm{ln}
丢失了。
为什么?那么使用 是否mathrm
不合适ln
?
TL 2020
答案1
您的自动生成代码很糟糕,抱歉。在
3\mathrm{ln}\left(x\right)
有三个原子,即
3
类型为 Ord\mathrm{ln}
类型为 Ord\left(x\right)
内部类型
在两个 Ord 类型的原子之间,TeX 不插入空格。
与此相反的,
3\ln\left(x\right)
又包含三个原子,但有一个很大的区别,即
3
类型为 Ord\ln
Op 类型\left(x\right)
内部类型
\thinmuskip
TeX在 Ord 原子和 Op 原子之间插入一个细小的空间(大小为)。
抱歉,但“垃圾进,垃圾出”。如果软件能够识别ln
要以直排方式输入的字符串,它完全可以主动输出,\ln
而不是输出错误的\mathrm{ln}
。
顺便说一句,和\left
也\right
不合适。有趣的是,“e”被翻译成{\mathrm e}
而不是更正确的\mathrm{e}
(如果你真的坚持把欧拉常数直立打印出来。
一个修复。
\documentclass[12pt]{book}
%\usepackage{xparse} % not needed for LaTeX 2020-10-01 or later
\usepackage{amsmath}
\usepackage{mleftright}
\mleftright
\ExplSyntaxOn
\NewCommandCopy{\latexmathrm}{\mathrm}
\RenewDocumentCommand{\mathrm}{m}
{
\str_case:nnF { #1 }
{
{e}{e}
{i}{i}
{ln}{\ln}
{log}{\log}
{sin}{\sin}
% ... add to the list
}
{ \latexmathrm{#1} }
}
\ExplSyntaxOff
\begin{document}
\[
4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)
\]
\[
4 e^{3 x}+3 \ln\left(x \right)
\]
\end{document}
对于 LuaLaTeX 和unicode-math
,解决方法必须有所不同。
\documentclass[12pt]{book}
%\usepackage{xparse} % not needed for LaTeX 2020-10-01 or later
\usepackage{amsmath}
\usepackage{mleftright}
\usepackage[mathit=sym,bold-style=ISO]{unicode-math}
\setmathfont{Asana Math}[Scale=MatchLowercase]
\setmainfont{Baskervaldx}[
UprightFont=*-Reg,
ItalicFont=*-Ita,
BoldFont=*-Bol,
BoldItalicFont=*-BolIta,
]
\mleftright
\ExplSyntaxOn
\AtBeginDocument
{
\NewCommandCopy{\latexmathrm}{\mathtextrm}
\RenewDocumentCommand{\mathtextrm}{m}
{
\str_case:nnF { #1 }
{
{e}{e}
{ln}{\ln}
{log}{\log}
{sin}{\sin}
% ... add to the list
}
{ \latexmathrm{#1} }
}
}% end of \AtBeginDocument
\ExplSyntaxOff
\begin{document}
\[
4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)
\]
\[
4 e^{3 x}+3 \ln\left(x \right)
\]
\end{document}
请注意,使用Baskervaldx.sty
时并不是正确的选择。fontspec
答案2
在这种情况下,ln
就是所谓的类对数运算符。
您可以使用\ln
或\operatorname{ln}
来\mathop{\mathrm{ln}}
获得像 这样的间距。如果您不喜欢在显示模式下下标和上标位于上方和下方的方式,\log
您还可以添加。\nolimits
如果amsmath
尚未定义它,您可以编写\providecommand\ln{\operatorname{ln}}
一个\ln
可以在源中使用的命令,并能够在一个易于找到的地方进行调整。