宏将 \text{Subst} 替换为 \operatorname{Subst}?

宏将 \text{Subst} 替换为 \operatorname{Subst}?

一些由 Mathematica 自动生成的乳胶包含此内容, \text{Subst}作为更长的乳胶的一部分。

有没有办法编写一个宏来替换,\text{Subst}然后\operatorname{Subst}将其放在序言中?我不知道如何使用\renewcommand 它来做到这一点。它将完全符合\text{Subst}我的要求,没有其他任何我想要更改的内容。即没有其他内容\text{stuff}

我想改变它的原因是,作为一个操作符,它看起来好不了多少。许多文件中有太多这样的操作符,因此使用编辑器并不实用。

我可以使用字符串替换模式在 Mathematica 中做出改变,但我认为如果可能的话最好使用 Latex 宏。

平均能量损失

\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}

%\renewcommand{\text{Subst}}{\operatorname{Subst}}%does not work
\begin{align*} 
y &= -2 \text{Subst}\left(\int \frac{1}{(3+x)^2} \, dx,x\right)
\end{align*}

%want the above to become as follows

\begin{align*} 
y &= -2 \operatorname{Subst}\left(\int \frac{1}{(3+x)^2} \, dx,x\right)
\end{align*}

\end{document}

我看了几个问题,但不知道该怎么做。

TL 2020

答案1

如果您无法让 Mathematica 输出\operatorname{Subst}而不是 ,\text{Subst}并且您可以自由使用 LuaLaTeX,那么以下解决方案可能会让您感兴趣。它执行模式匹配,并“即时”替换\text{Subst}输入文件中的所有 实例。替换操作分配给 LuaTeX 的回调,因此操作\operatorname{Subst}process_input_bufferTeX 开始其通常的处理操作(例如宏扩展)。观察\text不是以任何方式重新定义或修改。

我还想建议您加载mleftright包并使用\mleftand\mright代替\leftand \right。这将改善(,减少)“Subst”和大左括号之间的空格量。

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{amsmath,mleftright}
\usepackage{luacode} % for '\luaexec' macro
\luaexec{
function Subst ( s )
  return (s:gsub ( "\\text{Subst}" , "\\operatorname{Subst}" ))
end
luatexbase.add_to_callback("process_input_buffer", Subst , "Subst" ) 
}

\begin{document}
\begin{align*} 
y &= -2 \text{Subst}\mleft(\int \frac{1}{(3+x)^2} \, dx,x\mright) \\
  &= -2 \operatorname{Subst}\mleft(\int \frac{1}{(3+x)^2} \, dx,x\mright)
\end{align*}
\end{document}

答案2

这将是很多如果代码具有适当的标记,则更好,而不是依赖于脆弱的后处理。

但是,由于\operatorname只接受“安全”字符(除非使用 Unicode 引擎,否则不接受重音符号),您可以通过重新定义来解决\text

我也使用expl3,因此字符串切换功能已经可用。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{letltxmacro}

% save the meaning of \text
\LetLtxMacro{\AMStext}{\text}

% now redefine \text
\ExplSyntaxOn

\RenewDocumentCommand{\text}{m}
 {
  \str_case:nnF { #1 }
   {
    {Subst}{\operatorname{Subst}}
    {Foo}{\operatorname{\mathbf{Foo}}}
    % ...
   }
   {\AMStext{#1}}
 }
\ExplSyntaxOff

\begin{document}

\itshape

This is an operator $x\text{Subst}(y)$

This is also an operator $y\text{Foo}$

This is text $a\text{baz}$

\end{document}

在此处输入图片描述

答案3

我建议 Mathematica 不写\text或者\operatorname只写一些“占位符控制序列”,因为在 LaTeX 和许多人使用的包中通常没有定义。这样,您可以根据自己的喜好在序言/任何地方定义该占位符控制序列,而无需覆盖/重载/重新定义已经定义/用于不应重新定义的任何目的的控制序列。

是因为它可能:

您可以修补\text-command 来检查其参数是否完全由标记序列, , , ,组成。S11u11b11s11t11

正如\text“强健”的定义,您实际上需要修补名称为的命令。\text⟨space⟩

在下面的示例中,检查是通过处理分隔参数的宏来实现的,而不是通过定义临时宏并执行\ifx-comparison。这样,每次执行时,LaTeX 都无需(重新)定义临时宏。这反过来可能会在更频繁使用\text时节省一些 LaTeX 的内存。\text

使用分隔参数时,用户作为参数传入的短语嵌套在感叹号 ( !) 之间/短语中未出现的内容之间Subst。然后对短语进行检查!Subst!。这样,您可以在使用 -delimited 参数进行检查之前,找出用户作为参数传入的短语包含!(因此与短语不同)的情况。需要找出这种情况,以确保用户作为参数传入的短语不包含一组与分隔符不同但包含并因此与该分隔符匹配的标记。Subst!Subst!!Subst!

\documentclass[12pt]{article}
\usepackage{amsmath}
\makeatletter
%%-----------------------------------------------------------------------------
%% Check whether argument is empty:
%%.............................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%%                     {<Tokens to be delivered in case that argument
%%                       which is to be checked is empty>}%
%%                     {<Tokens to be delivered in case that argument
%%                       which is to be checked is not empty>}%
%%
%% This macro is explained in detail in:
%% <https://tex.stackexchange.com/a/522506/118714>
%% (The name given to it in that explanation is \CheckWhetherEmpty.)
%%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
\newcommand\UD@CheckWhetherNull[1]{%
  \romannumeral0\expandafter\@secondoftwo\string{\expandafter
  \@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
  \@secondoftwo\string}\expandafter\@firstoftwo\expandafter{\expandafter
  \@secondoftwo\string}\@firstoftwo\expandafter{} \@secondoftwo}%
  {\@firstoftwo\expandafter{} \@firstoftwo}%
}%
%%-----------------------------------------------------------------------------
\@ifdefinable\UD@GobbleToExclam{\long\def\UD@GobbleToExclam#1!{}}%
%%-----------------------------------------------------------------------------
\@ifdefinable\UD@SubstFork{%
  \long\def\UD@SubstFork#1!Subst!#2#3!!!!{#2}%
}%
\newcommand\UD@CheckWhetherSubst[3]{%
  \romannumeral0%
  \expandafter\UD@CheckWhetherNull\expandafter{\UD@GobbleToExclam#1!}{%
    \UD@SubstFork
    !#1!{ #2}% Case: #1 = Subst
    !Subst!{ #3}% Case: #1 is empty or something else without ! 
    !!!!%
  }{ #3}% Case: #1 is something else with ! 
}%
%%-----------------------------------------------------------------------------
%% Patch the command \text:
%% \text is robust, so actually the command \text<space> needs to be patched.
%%-----------------------------------------------------------------------------
\@ifdefinable\UD@Saved@Command@text{%
  \expandafter\let\expandafter\UD@Saved@Command@text\expandafter=\csname text \endcsname
}%
\long\@namedef{text }#1{%
  \UD@CheckWhetherSubst{#1}{\operatorname}{\UD@Saved@Command@text}{#1}%
}%
\makeatother

\begin{document}

\begin{align*} 
y &= -2 \text{Subst}\left(\int \frac{1}{(3+x)^2} \, dx,x\right)\\
  &= -2 \operatorname{Subst}\left(\int \frac{1}{(3+x)^2} \, dx,x\right)\\
  &\operatorname{Subst}&(\text{produced by {\tt\string\operatorname\{Subst\}}})\\
  &\text{Subst}&(\text{{\tt\string\operatorname}-variant produced by {\tt\string\text\{Subst\}}})\\
  &\text{Subst\empty}&(\text{{\tt\string\text}-variant produced by {\tt\string\text\{Subst\string\empty\}}})\\
  &\text{!Subst!}\\
  &\text{SubstSubst}\\
  &\text{Some bla bla}
\end{align*}


\end{document}

在此处输入图片描述

答案4

\text您可以保存to的原始含义\origtext,然后定义\text为一个宏,测试其参数是否为“Subst”:

\let\origtext=\text
\def\Subst{Subst}
\protected\def\text#1{\def\tmp{#1}\ifx\tmp\Subst 
   \expandafter \operatorname \else \expandafter \origtext \fi{#1}}

相关内容