标准 LaTeX 有机会编写类似 的内容$\log^2{x}$
。然而,在加载包时,这不再可能skmath
,因为skmath
期望输入对数$\log[<base>]{<expression>}$
。
我是否遗漏了什么,或者是否只能通过重新定义来实现这一点\log
。
PS:我知道这在$\log{<expression>}^2
数学上是相同的,并且目前已将其设置为相同,但上述方法对我来说似乎更易于阅读。
答案1
如果您愿意接受此语法作为解决方案,则可以对语法进行一种可能的重新定义:
\log[<base>][<exponent>]{<expression>}
所需的重新定义:
\ExplSyntaxOn
\RenewDocumentCommand\log{oom}{%
\IfNoValueTF{#1}
{\ensuremath{\__skmath_log:\IfNoValueTF{#2}{}{\c_math_superscript_token{#2}}\__skmath_parens:n{#3}}}
{\ensuremath{\__skmath_log:\c_math_subscript_token{#1}\IfNoValueTF{#2}{}{\c_math_superscript_token{#2}}\__skmath_parens:n{#3}}}%
}
\ExplSyntaxOff
完整的文档,其中有大量测试用例展示省略/空参数的行为:
\documentclass{article}
\usepackage{skmath}
\ExplSyntaxOn
\RenewDocumentCommand\log{oom}{%
\IfNoValueTF{#1}
{\ensuremath{\__skmath_log:\IfNoValueTF{#2}{}{\c_math_superscript_token{#2}}\__skmath_parens:n{#3}}}
{\ensuremath{\__skmath_log:\c_math_subscript_token{#1}\IfNoValueTF{#2}{}{\c_math_superscript_token{#2}}\__skmath_parens:n{#3}}}%
}
\ExplSyntaxOff
\begin{document}
\begin{gather}
\log[10][2]{x} \\
\log[10][]{x} \\
\log[10]{x} \\
\log[][2]{x} \\
\log[][]{x} \\
\log[]{x} \\
\log{x} \\
\log[10][2]{} \\
\log[10][]{} \\
\log[][2]{} \\
\log[][]{}
\end{gather}
\end{document}
其输出如下:
答案2
这是一篇旧帖子,但我认为我应该提供一种替代方法来对比已接受的答案。
使用 xparser,您可以使用修饰来实现如下语法:
\log*{x}^{yy}_{zzz} % with parentheses
\log{x}^{yy}_{zzz} % without
它会像下面这样,请注意,使用这些装饰可能存在一些我不熟悉的技术原因
\let\oldlog\log
\RenewDocumentCommand{\log}{s m e{_^}}{%
\ensuremath{%
\mathrm{log}%
\IfValueT{#3}{_{#3}}%
\IfValueT{#4}{^{#4}}%
\IfBooleanTF{#1}{\!\left(#2\right)}{#2}%
}%
}