在他 1989 年的作品中免费定理!(doi:10.1145/99370.99404,预印本.dvi
) 论文中,Wadler 将连接运算排版为两个“加号”折叠起来:
我问write-math.com和解毒命名这个操作符但没有成功,除了一个不太优雅的解决方案之外找不到任何东西,这个解决方案是由博客,其内容是定义
\newcommand{\concat}{\ensuremath{+\!\!\!\!+\,}}
这个运算符是否在我不知道的包中定义,这个符号没有使用根本?
答案1
我认为将两个加号部分叠加的想法并没有什么不好。我以前从未见过这样的符号,但做对并不难,而你找到的宏则不然。
\documentclass{article}
\usepackage{amsmath}
\newcommand{\concat}{%
\mathbin{{+}\mspace{-8mu}{+}}%
}
\newcommand{\starop}[1]{\mathop{#1^*}}
\begin{document}
\begin{gather*}
({\concat}): \forall X.\ X^* \to X^* \to X^* \\
\starop{a}(xs\concat_{A} ys)=(\starop{a} xs)\concat_{A'}(\starop{a} ys)
\end{gather*}
\end{document}
与原文对比:
它们似乎只是为了在我的输出中更好地留出空间而有所不同。;-)
也许垂直条之间的距离略有不同,请调整以适应。
是的,从我转换成 PDF 的 DVI 文件来看,原文使用了两个加号。
替代版本
您可能更喜欢不同的符号,与标准加号一样高和宽。
使用颜色是为了精确显示两个符号具有相同的宽度(红色或黑色不会溢出)。再次调整垂直条之间的距离以适应。
\documentclass{article}
\usepackage{amsmath,pict2e,color}
\makeatletter
\newcommand{\concat}{\mathbin{\mathpalette\conc@t\relax}}
\newcommand{\conc@t}[2]{%
\vcenter{\hbox{%
\sbox\z@{$\m@th#1-$}%
\setlength{\unitlength}{\wd\z@}%
\begin{picture}(1,1)
\roundcap
\put(0.1,0.5){\line(1,0){0.8}}
\put(0.35,0.1){\line(0,1){0.8}}
\put(0.65,0.1){\line(0,1){0.8}}
\end{picture}%
}}%
}
\makeatother
\newcommand{\starop}[1]{\mathop{#1^*}}
\begin{document}
\begin{gather*}
\rlap{\color{red}$+$}{\concat}{\concat}\llap{\color{red}$+$}\\
\rlap{\color{red}$\concat$}{+}{+}\llap{\color{red}$\concat$}\\
{+}{\concat}\quad a_{\concat_{\concat}}\\
{+}\\
{\concat}\\
({\concat}): \forall X.\ X^* \to X^* \to X^* \\
\starop{a}(xs\concat_{A} ys)=(\starop{a} xs)\concat_{A'}(\starop{a} ys)
\end{gather*}
\end{document}
答案2
答案3
我认为二进制符号与另一个二进制符号正确对齐很重要。一个明显的解决方法是使用\scalebox
和兄弟,但如果有人想展示的话,我会把它们留给另一个答案。这是一个(令人惊讶地)有效的版本。
我从 egreg 复制了代码:)
\documentclass{scrartcl}
\usepackage{mathtools,calc}
\makeatletter
\newcommand*\concat
{\mathbin{\mathmakebox[\widthof{${+}\m@th$}]{+\hskip-1emplus1fil+}}}
\newcommand*\starop[1]{\mathop{#1^*}}
\makeatother
\begin{document}
\begin{gather*}
({\concat})\colon \forall X.\ X^* \to X^* \to X^* \\
\starop{a}(xs\concat_{A} ys)=(\starop{a} xs)\concat_{A'}(\starop{a} ys)
\end{gather*}
\begin{align*}
a + b + c + d \\
a \concat b \concat c \concat d
\end{align*}
\end{document}