数学模式下的字符串替换

数学模式下的字符串替换

在图表中写入路径不会$a-b-c$像 那样排版好$a\text{-}b\text{-}c$,所以我试图创建一个执行一些字符串替换的宏。我尝试使用xstring,但不幸的是它在数学模式下似乎不起作用。例如,

\StrSubstitute{a-b-c}{-}{\text{-}}

工作正常,但是

$\StrSubstitute{a-b-c}{-}{\text{-}}$

会失败。创建宏的最佳方法是什么,\mpath以便我可以简单地写入$\mpath{a-b-c}$

答案1

这是 Expl3 序列命令的绝佳用例。以下是使用这些命令的宏:

\ExplSyntaxOn
\NewDocumentCommand{\mpath}{m}{
  \seq_set_split:Nnn \l_tmpa_seq {-} {#1} % ❶
  \seq_use:Nn \l_tmpa_seq {{-}} % ❷
}
\ExplSyntaxOff

-首先,❶我们使用分隔符将参数拆分成一个序列。¹\l_tmpa_seq将是一个序列,其中的每一位文本都由-序列中的单独项分隔。

然后,❷ 我们通过将元素重新连接在一起并将其转储到输出中来使用该序列。²


  1. 默认情况下提供,供我们临时使用。
  2. 我认为这不是您真正想要的。我猜您对数学模式中的\text{-}二进制运算符间距不满意,所以我只是将- 视为普通符号而不是二进制运算符,并且那里没有额外的间距。-{-}

答案2

你可能会

\newcommand{\mpath}[1]{%
  \begingroup\noexpandarg
  \StrSubstitute{#1}{-}{\text{-}}%
  \endgroup
}

从而抑制 所进行的论证的充分展开xstring

仅使用原始元素的简单解决方案。任您选择

\documentclass{article}
\usepackage{amsmath}

\newcommand{\mpathminus}[1]{%
  \begingroup
  \mathcode`-=\numexpr\mathcode`- - "2000\relax
  #1%
  \endgroup
}
\newcommand{\mpathendash}[1]{%
  \begingroup
  \mathcode`-=123
  #1
  \endgroup
}
\newcommand{\mpathemdash}[1]{%
  \begingroup
  \mathcode`-=124
  #1
  \endgroup
}

\begin{document}

$\mpathminus{a-b-c}$

$\mpathendash{a-b-c}$

$\mpathemdash{a-b-c}$

\end{document}

在此处输入图片描述

但是,间距似乎不太好,因此你可以做得更好:

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\mpathhyphen}{m}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_replace_all:Nnn \l_tmpa_tl { - } { \mspace{2mu}{\operatorname{-}}\mspace{1mu} }
  \tl_use:N \l_tmpa_tl
 }
\NewDocumentCommand{\mpathminus}{m}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_replace_all:Nnn \l_tmpa_tl { - } { {-} }
  \tl_use:N \l_tmpa_tl
 }
\NewDocumentCommand{\mpathendash}{m}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_replace_all:Nnn \l_tmpa_tl { - } { \mspace{2mu}{\operatorname{--}}\mspace{1mu} }
  \tl_use:N \l_tmpa_tl
 }
\NewDocumentCommand{\mpathemdash}{m}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_replace_all:Nnn \l_tmpa_tl { - } { \mspace{2mu}{\operatorname{---}}\mspace{1mu} }
  \tl_use:N \l_tmpa_tl
 }

\ExplSyntaxOff

\begin{document}

$\mpathhyphen{a-b-c}$

$\mpathminus{a-b-c}$

$\mpathendash{a-b-c}$

$\mpathemdash{a-b-c}$

\end{document}

在此处输入图片描述

在这里,我们利用\operatorname改变数学代码-来产生真正的连字符(或组合的连字符)。

答案3

为了多样化,这里有一个基于 LuaLaTeX 的解决方案。它定义了一个名为 的 LaTeX 宏,借助 Lua 强大的字符串函数,\mpath将所有 替换为短划线。-string.gsub

请注意,印刷短划线比数学类型的“减号”符号略细,间距更紧密。如果您希望线条更粗、间距更松,只需在 的第三个参数中替换\\mbox{--}为即可。{-}string.gsub

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\newcommand\mpath[1]{\directlua{%
    tex.sprint(( string.gsub( "#1" , "-" , "\\mbox{--}" )) )}}
   
\begin{document}
$\mpath{a-b-c}$
\end{document}

答案4

一个简单的令牌循环。

定义{}{}{}中的告诉循环“忽略组、忽略宏和忽略空格”,这无论如何都不应该出现在参数中。

\documentclass{article}
\usepackage{tokcycle,amsmath}
\newcommand\mpath[1]{\tokcycle{\ifx-##1\text{-}\else##1\fi}{}{}{}{#1}}
\begin{document}
$\mpath{a-b-c}$
\end{document}

在此处输入图片描述

这里有一种listofitems方法,其中列表在-标记处进行解析,并且重新引用,并\text{-}在分隔符处插入。

\documentclass{article}
\usepackage{listofitems,amsmath}
\setsepchar{-}
\newcommand\mpath[1]{\readlist\pathlist{#1}%
  \foreachitem\z\in\pathlist[]{\ifnum\zcnt=1\else\text{-}\fi\z}}
\begin{document}
$\mpath{a-b-c}$
\end{document}

相关内容