在图表中写入路径不会$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
将是一个序列,其中的每一位文本都由-
序列中的单独项分隔。
然后,❷ 我们通过将元素重新连接在一起并将其转储到输出中来使用该序列。²
- 默认情况下提供,供我们临时使用。
- 我认为这不是您真正想要的。我猜您对数学模式中的
\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}